文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>纠结的Python2.7编码与os.walk()函数的目录参数

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

时间:2011-01-26  来源:sumory

os.walk()函数是在需要深度访问一个目录时经常要使用的,前段时间在写一个toolkit(稍后陆续放出),里面有个功能需要这个函数,以前使用时传递的参数都是英文的,所以没太注意这个问题,没想到这次在使用中文的时候麻烦就出现了。先来看两个函数(文件头:# -*- coding: UTF-8 -*-):

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!')
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的编码搞清楚再去勇敢地使用中文吧,哎…

相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载