转载于:http://www.cnblogs.com/sumory/archive/2011/01/26/1945521.html
Python3与Python2.x系列的编码处理(类型,文件等)有所不同,具体这里就不再介绍了,网上有很多相关文章。
这里分享一个纠结了非常久的问题(因为一开始没特别注意函数参数的编码问题,所以浪费了不少时间,希望能给同样遇到这个问题的朋友们一点帮助)。
os.walk()函数是在需要深度访问一个目录时经常要使用的,前段时间在写一个toolkit(稍后陆续放出),里面有个功能需要这个函数,以前使用时传递的参数都是英文的,所以没太注意这个问题,没想到这次在使用中文的时候麻烦就出现了。先来看两个函数(文件头:# -*- coding: UTF-8 -*-):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
def
encrypt(
dir
,outfile,suffix,recursion):
exts
=
suffix.split(
"|"
)
all_files
=
[]
print
(
'传入的目录:'
+
dir
.decode(
'gbk'
))
#请注意,print的时候需要decode下,不然是乱码
#当前递归的目录,当前递归的目录下的所有子目录,当前递归的目录下的所有文件
for
root, dirs, files
in
os.walk(
dir
):
print
(
'正在调用...'
)
for
name
in
files:
file_path
=
unicode
(os.path.join(root,name),
'gbk'
)
#全称,正确地取得windows下的中文文件名
extension
=
os.path.splitext(file_path)[
1
]
if
extension[:
1
]!
=
'.'
:
extension
=
'.'
+
extension
if
extension
in
exts:
oldfile
=
file_path
extensionlen
=
-
len
(extension)
newfile
=
oldfile[:extensionlen]
+
'-new'
+
extension
os.rename(oldfile, newfile)
all_files.append(
'/'
.join(file_path.split(
'\\'))+"<>"+'
/
'.join(newfile.split('
\\')))
if
(
not
recursion):
break
if
len
(all_files)>
0
:
file
=
open
(outfile,
"w"
)
try
:
file
.write(
"\n"
.join(all_files))
print
(
'successfully writes %d lines(files).'
%
len
(all_files))
finally
:
file
.close()
else
:
print
(
'sorry,no files found!'
)
|
1
2
3
4
5
6
7
|
def
invoke():
#dir=unicode("D:/allfiles/备份/a",'gbk')千万别想反了,要编码而不是解码
#dir="D:/allfiles/"英文时不用编码即可正确执行
dir
=
"D:/allfiles/备份/a"
.encode(
'gbk'
)
#当路径中含有中文时一定要编码之后才能被walk函数正确使用
outfile
=
"D:/binaries.dat"
suffix
=
".c|.cpp"
encrypt(
dir
,outfile,suffix,
1
)
|
这两个函数的功能是遍历一个目录下指定后缀名的文件,并将其重命名,之后将改变记录到log文件,待下次恢复时使用。
主要问题出现在dir变量,当里面含有中文字符时,不会报错,但是不会进入for root, dirs, files in os.walk(dir): 循环体,调了好久才发现这个问题,一开始就忽略了参数的编码问题。后来意识到编码后,纠结了好久才调正确,归结起来有以下几点需要注意:
windows中一般需要gbk编码来与python的默认编码(unicode,python3系列我还没有尝试)进行转换;
在上面的函数中,所位于的python文件编码为utf-8(# -*- coding: UTF-8 -*-),所以参数dir变量需要先decode(’utf-8’),然后encode(’gbk’),decode可以省略;
当然在encrypt()函数中print时若需要看到正确的中文需要decode(’gbk’)。
最后一点教训是,还是把编码问题,尤其是python2.x的编码搞清楚再去勇敢地使用中文吧,哎…