纠结的Python2.7编码与os.walk()函数的目录参数
时间:2011-01-27
来源:互联网
转:sumory
纠结的Python2.7编码与os.walk()函数的目录参数
Python3与Python2.x系列的编码处理(类型,文件等)有所不同,具体这里就不再介绍了,网上有很多相关文章。
这里分享一个纠结了非常久的问题(因为一开始没特别注意函数参数的编码问题,所以浪费了不少时间,希望能给同样遇到这个问题的朋友们一点帮助)。
os.walk()函数是在需要深度访问一个目录时经常要使用的,前段时间在写一个toolkit(稍后陆续放出),里面有个功能需要这个函数,以前使用时传递的参数都是英文的,所以没太注意这个问题,没想到这次在使用中文的时候麻烦就出现了。先来看两个函数(文件头:# -*- coding: UTF-8 -*-):
复制代码
这两个函数的功能是遍历一个目录下指定后缀名的文件,并将其重命名,之后将改变记录到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的编码搞清楚再去勇敢地使用中文吧,哎…
纠结的Python2.7编码与os.walk()函数的目录参数
Python3与Python2.x系列的编码处理(类型,文件等)有所不同,具体这里就不再介绍了,网上有很多相关文章。
这里分享一个纠结了非常久的问题(因为一开始没特别注意函数参数的编码问题,所以浪费了不少时间,希望能给同样遇到这个问题的朋友们一点帮助)。
os.walk()函数是在需要深度访问一个目录时经常要使用的,前段时间在写一个toolkit(稍后陆续放出),里面有个功能需要这个函数,以前使用时传递的参数都是英文的,所以没太注意这个问题,没想到这次在使用中文的时候麻烦就出现了。先来看两个函数(文件头:# -*- coding: UTF-8 -*-):
- 01 def encrypt(dir,outfile,suffix,recursion):
-
- 02 exts = suffix.split("|")
-
- 03 all_files=[]
-
- 04 print('传入的目录:'+dir.decode('gbk'))#请注意,print的时候需要decode下,不然是乱码
-
- 05 #当前递归的目录,当前递归的目录下的所有子目录,当前递归的目录下的所有文件
-
- 06 for root, dirs, files in os.walk(dir):
-
- 07 print('正在调用...')
-
- 08 for name in files:
-
- 09 file_path=unicode(os.path.join(root,name),'gbk')#全称,正确地取得windows下的中文文件名
-
- 10 extension=os.path.splitext(file_path)[1]
-
- 11
-
- 12 if extension[:1]!='.':
-
- 13 extension='.'+extension
-
- 14 if extension in exts:
-
- 15 oldfile=file_path
-
- 16 extensionlen=-len(extension)
-
- 17 newfile=oldfile[:extensionlen]+'-new'+extension
-
- 18 os.rename(oldfile, newfile)
-
- 19 all_files.append('/'.join(file_path.split('\\'))+"<>"+'/'.join(newfile.split('\\')))
-
- 20 if(not recursion):
-
- 21 break
-
- 22 if len(all_files)>0:
-
- 23 file = open(outfile,"w")
-
- 24 try:
-
- 25 file.write("\n".join(all_files))
-
- 26 print('successfully writes %d lines(files).' %len(all_files))
-
- 27 finally:
-
- 28 file.close()
-
- 29 else:
-
- 30 print('sorry,no files found!')
-
- 1 def invoke():
-
- 2 #dir=unicode("D:/allfiles/备份/a",'gbk')千万别想反了,要编码而不是解码
-
- 3 #dir="D:/allfiles/"英文时不用编码即可正确执行
-
- 4 dir="D:/allfiles/备份/a".encode('gbk')#当路径中含有中文时一定要编码之后才能被walk函数正确使用
-
- 5 outfile="D:/binaries.dat"
-
- 6 suffix = ".c|.cpp"
-
- 7 encrypt(dir,outfile,suffix,1)
主要问题出现在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的编码搞清楚再去勇敢地使用中文吧,哎…
作者: 中关村村草 发布时间: 2011-01-27
直接用 "GBK" 硬编码个人感觉并不合适,如果把代码拿到 Linux/Unix等其他系统上、或者是非中文的 Windows 下,都会出问题的。
有个稍微好一点的办法,就是通过 sys.stdin.encoding 来获取应该使用的编码,而不是直接选择用某种固定的编码。
有个稍微好一点的办法,就是通过 sys.stdin.encoding 来获取应该使用的编码,而不是直接选择用某种固定的编码。
作者: tubocurarine 发布时间: 2011-01-27
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28