【发布时间】:2015-06-25 17:31:28
【问题描述】:
我正在尝试遍历目录树并在找到任何特定类型的文件时返回 true:
for dirpath, dirnames, filenames in os.walk(location):
for f in filenames:
if fn.endswith(".eml") or fn.endswith(".zip"):
return True
这始终在远程系统的挂载点内工作。 NFS 挂载从未出现过问题。
我们最近有人做了 CIFS 挂载,其中一个文件名包含 \xc2\xb9 字符(上标之一)。在这种情况下,我们得到了回溯:
for dirpath, dirnames, filenames in os.walk(location):
File "/usr/lib64/python2.6/os.py", line 294, in walk
for x in walk(path, topdown, onerror, followlinks):
File "/usr/lib64/python2.6/os.py", line 284, in walk
if isdir(join(top, name)):
File "/usr/lib64/python2.6/posixpath.py", line 70, in join
path += '/' + b
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 23: ordinal not in range(128)
现在,问题来了:这只发生在代码在 FCGI 中执行时。我可以作为独立程序在同一棵树上运行相同的代码,并且没有回溯。除了“不要使用 os.walk()”之外还有什么建议吗?
免责声明:我们使用的是旧版本的 Django。我无法改变这一点。
【问题讨论】:
-
你能检查一下
sys.getdefaultencoding()的值,看看它在fcgi的情况下是否不同?另请注意,python 2.6 自 2013 年起停产(您可能也无法更改,但有参数会有所帮助)。 -
我怀疑这与 django 有关。您没有使用 终端 来运行它,这更相关。
-
sys.getdefaultencoding() 在这两种情况下都是 'ascii'。
-
还检查了 sys.getfilesystemencoding()。在这两种情况下都是“ANSI_X3.4-1968”。
标签: python django fastcgi os.walk