【问题标题】:Python: How do I interact with unicode filenames on Windows? (Python 2.7)Python:如何在 Windows 上与 unicode 文件名交互? (Python 2.7)
【发布时间】:2018-06-13 11:00:22
【问题描述】:

我的问题:

  1. 从美国 Windows 10 安装开始
  2. 在 Windows 资源管理器中创建日语文件名
  3. 打开 Python shell,然后os.listdir('.')
  4. 列出的文件名全是问号。
  5. os.path.exists() 不出所料地报告找不到文件。

NTFS 将文件名存储为 Unicode。我确信如果我使用了win32api CreateFile() 系列函数,我会得到我的 Unicode 文件名,但是这些 API 太麻烦(而且不可移植)。我希望我得到 utf-8 编码的文件名,或者 FS 目录结构中的 Unicode 字节,但在默认模式下,这似乎不会发生。

我尝试过使用setlocale(),但我还没有找到正确的参数来使我的程序正常工作。我不想(也不能)在 Windows 机器上安装额外的代码页。这需要与 Windows 的库存安装一起使用。

请注意,这与控制台无关。 repr() 表明 ?以os.listdir('.') 列出的文件名结尾的字符是真正的问号,而不是一些显示伪影。我假设它们是由listdir() 在后台使用的 API 添加的。

【问题讨论】:

  • 你想用 Python 打开文件吗?
  • @MelvinAbraham 是的。
  • @Keely “Unicode 文件名”是什么意思? Windows 默认使用 Unicode。文件名 Unicode。字符串 Unicode。它们没有什么困难、麻烦或不可移植的——所有 Windows 程序都可以很好地使用它们。您是否尝试在 Python 代码中使用 ANSI 字符串 并使用错误的代码页?
  • @Keely 是的,你做了The listed filename is full of question marks.。这些是错误替换字符。这意味着您使用了一个使用一个代码页的 ANSI 字符串,但您的程序使用 另一个 不兼容的代码页运行。如果您使用例如挪威字符,您会遇到同样的问题。任何无法翻译的字符都被替换为?。解决方案是使用代码页。
  • +10 到 Melvin 所说的 - 控制台使用用户/系统的区域设置显示文本。字符串可能没问题,但会显示替换字符。您可以更改 console 的 区域设置,甚至将其切换为 65536 (UTF8),但这不会影响程序的实际运行方式,只会影响 console 处理文本的方式。

标签: python windows unicode ntfs


【解决方案1】:

在使用os.listdir() 在控制台中显示该文件名时,您可能会得到?s,但您可以毫无问题地访问该文件名,因为内部所有内容都以二进制形式存储。如果您尝试复制文件名并将其直接粘贴到 python 中,它将被解释为仅仅是问号...

如果你想打开那个文件并执行任何操作,那么,看看这个......

files = os.listdir(".")

# Possible output:
# ["a.txt", "file.py", ..., "??.html"]

filename = files[-1]    # The last file in this case
f = open(filename, 'r')

# Sample file operation

lines = f.readlines()
print(lines)
f.close()

编辑:

在 Python 2 中,您需要将当前路径作为 Unicode 传递,这可以使用:os.listdir(u'.'),其中. 表示当前路径。这将返回 Unicode 格式的文件名列表...

【讨论】:

  • 一个简单的chcp 65001 可能就足以显示UTF8文本
  • 是的,如果您只想显示文件名,您可以这样做!但是,如果您只想以编程方式执行一些文件操作,那么这是您可以这样做的方法之一。
  • 这不是问题。我也是在命令行中这样做的,后来为了可读性而转换为脚本。我所做的一切都完全按照描述...os.path.exists(files[-1]) 在我的情况下返回了True(因为我在最后一个索引中列出了该文件)。通过?,我的意思是仅没有按原样显示的日文文本。 好像你没有测试代码...
  • Windows 10 Pro(内部版本 16299.125)中的 Python 版本 3.5.3...
  • 在 Python3 中一切正常。我想这是有道理的。 Python 3 中只有 Unicode 字符串,所以当我执行 os.listdir() 时,我会返回一些将自己描述为 str 的东西,但那是 python 3 str 并且它带有 unicode 字符正好。对于 Python 2,os.listdir() 返回一个 Python 2 'str'(即不是 unicode)对象并且不能传达 Unicode 字符。不幸的是,我目前确实需要使用 Python 2.7,但我会在以后的项目中记住这一点。
猜你喜欢
  • 2023-04-05
  • 2019-09-30
  • 1970-01-01
  • 2019-02-18
  • 2019-11-08
  • 2016-02-24
  • 1970-01-01
  • 2017-06-07
  • 2023-03-06
相关资源
最近更新 更多