纠结的Python2.7编码与os.walk()函数的目录参数
2011-10-17 22:55
465 查看
Python3与Python2.x系列的编码处理(类型,文件等)有所不同,具体这里就不再介绍了,网上有很多相关文章。
这里分享一个纠结了非常久的问题(因为一开始没特别注意函数参数的编码问题,所以浪费了不少时间,希望能给同样遇到这个问题的朋友们一点帮助)。
os.walk()函数是在需要深度访问一个目录时经常要使用的,前段时间在写一个toolkit(稍后陆续放出),里面有个功能需要这个函数,以前使用时传递的参数都是英文的,所以没太注意这个问题,没想到这次在使用中文的时候麻烦就出现了。
这两个函数的功能是遍历一个目录下指定后缀名的文件,并将其重命名,之后将改变记录到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的编码搞清楚再去勇敢地使用中文吧,哎…
os.walk()可以使用字典保存目录结构信息,例如:
这里分享一个纠结了非常久的问题(因为一开始没特别注意函数参数的编码问题,所以浪费了不少时间,希望能给同样遇到这个问题的朋友们一点帮助)。
os.walk()函数是在需要深度访问一个目录时经常要使用的,前段时间在写一个toolkit(稍后陆续放出),里面有个功能需要这个函数,以前使用时传递的参数都是英文的,所以没太注意这个问题,没想到这次在使用中文的时候麻烦就出现了。
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!')
这两个函数的功能是遍历一个目录下指定后缀名的文件,并将其重命名,之后将改变记录到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的编码搞清楚再去勇敢地使用中文吧,哎…
os.walk()可以使用字典保存目录结构信息,例如:
import os walker={} for root,dirs,files in os.walk('/tmp'): walker[root]=(dirs,files) print walker.keys() for p in walker: print walker[p][1]
相关文章推荐
- 纠结的Python2.7编码与os.walk()函数的目录参数
- 纠结的Python2.7编码与os.walk()函数的目录参数
- python笔记4-遍历文件夹目录os.walk()
- python 遍历目录 os.walk()
- python3 os模块文件、目录常用函数方法总结
- python 获取文件下所有文件或目录os.walk()
- Python 用 os.walk 遍历目录
- Python os.path 关于关于文件/目录的常用函数和方法
- Python使用os.listdir()函数来得目录内容的介绍
- Python 用 os.walk 遍历目录
- 系统:win10 IDE:pycharm Python版本:2.7 安装第三方插件是报错: 这里写图片描述 报错原因与编码有关,pip把下载的临时文件存放在了用户临时文件中,这个目录一般是C
- Python os.walk 遍历文件目录
- Python 用 os.walk 遍历目录
- [python]怎么样用Python读取一个目录树-os.walk入门
- 自学python之——os.walk 查找目录下的文件
- Python os.walk 函数
- python包装os.walk遍历目录树
- python shell中python os模块实用函数(含改变当前工作路径、显示当前目录等)
- Python使用os.listdir()函数来得目录内容的介绍
- python 获取文件下所有文件或目录os.walk()