Python os.walk 如何支持 Unicode/UTF-8?

2 投票
1 回答
4105 浏览
提问于 2025-04-18 16:54

我研究了一下这个问题,发现Python 2.7默认使用的是ASCII编码,而我不能切换到Python 3(默认使用Unicode),因为有些库不兼容。

# -*- coding: utf-8 -*- print u'порядке'

这个代码看起来能正常打印出内容,如果不加u的话,就会变成??????。但是,print list(os.walk(ur'c:\somefoler'))却返回\u0438\u0442...,为什么这个输出就不能像第一次那样可读呢?我在用os.walk的时候用的是变量,不能用ur,我只是想搞明白,怎么才能让我的代码在处理任何文件夹或文件时都能正常工作。我用os.walk加上保存到文件的方式,似乎总是出现????,特别是处理西里尔字母的时候。

def findit(self,root, exclude_files=[], exclude_dirs=[]):
    exclude_files = (fnmatch.translate(i) for i in exclude_files)
    exclude_files = '('+')|('.join(exclude_files)+')'
    exclude_files = re.compile(exclude_files)
    exclude_dirs = (os.path.normpath(i) for i in exclude_dirs)
    exclude_dirs = (os.path.normcase(i) for i in exclude_dirs)
    exclude_dirs = set(exclude_dirs)
    for root, dirs, files in os.walk(root):
        if os.path.normpath(os.path.normcase(root)) in exclude_dirs:
            # exclude this dir and subdirectories
            dirs[:] = []
            continue
        for f in files:
            if not exclude_files.match(os.path.normcase(f)):
                yield os.path.join(root, f)

filelist = list(findit('c:\\',exclude_files = ['*.dll', '*.dat', '*.log', '*.exe'], exclude_dirs = ['c:/windows', 'c:/program files', 'c:/else']))

当我使用变量时,似乎必须用.decode('utf-8'),那为什么不能直接用Unicode,比如u'var'呢?而且为什么会有很多次出现转换失败的异常?我遇到过这样的情况,看到很多关于这个错误的回答,我很难理解,难道就没有办法让它正常工作吗?

1 个回答

2

尝试一下

root = ur'c:\somefoler'
for current,dirs,files in os.walk(root):
    for file in files:
        print file, repr(file)

你应该能看到正确的内容(还有列表中使用的表示方式)……问题在于,当你打印一个列表时,它会打印出列表中每个项目的表示形式

撰写回答