纠结的Python2.7编码与os.walk()函数的目录参数

转载于: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的编码搞清楚再去勇敢地使用中文吧,哎…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值