0

我有一个用 Python 2.7 编写的应用程序,它使用 os.walk 从硬盘驱动器读取用户文件。

该应用程序需要 UTF-8 系统语言环境(我们在启动之前检查 env 变量),因为我们处理带有 Unicode 字符的文件(例如,其中包含艺术家姓名的音频文件),并希望确保我们可以保存这些文件文件系统的正确文件名。

我们的一些用户有 UTF-8 语言环境(因此是 UTF-8 fs),但仍然设法将 ISO-8859-1 文件存储在他们的驱动器上。当我们的代码尝试 os.walk() 这些目录时,这会导致问题,因为 Python 在尝试使用 UTF-8 解码此 ISO-8859-1 字节序列时会抛出异常。

所以我的问题是,我如何让 python 忽略这个文件并继续下一个而不是中止整个os.walk()。我应该滚动自己的 os.walk() 函数吗?

编辑:到目前为止,我们一直在告诉我们的用户使用 convmv linux 命令来更正他们的文件名,但是许多用户有各种不同类型的编码(8859-1、8859-2 等),并且使用 convmv 需要用户在单独对每个文件运行 convmv 之前,对哪些文件具有什么编码进行有根据的猜测。

4

2 回答 2

3

请阅读Unicode 文件名,这是 Python Unicode how-to 的一部分。最重要的是,文件系统编码不一定与终端中当前的 LANG 设置相同。

具体来说,os.walk它是基于os.listdir.

改为传递一个 8 位路径,您的代码将正常工作,然后根据需要从 UTF-8 或 ISO 8859-1 解码。

于 2012-07-27T14:01:28.487 回答
0

使用字符编码检测,python 的 chardet 模块可以很好地确定实际编码有一定的信心。“酌情”——您要么知道编码,要么必须猜测它。如果使用 chardet 你猜错了,至少你试过了。

于 2012-08-06T21:10:19.283 回答