【问题标题】:Cannot open text files in Python 3: Unicode error无法在 Python 3 中打开文本文件:Unicode 错误
【发布时间】:2021-08-11 00:47:26
【问题描述】:

我在 Python 3.8 中打开一个简单的文本文件时遇到问题。我设置了一个简单的测试。

这是我的测试代码:

import os

file_path = "c:\Users\username\Documents\folder1\some_file.txt"

with open(file_path, 'r') as f:
    for line in f:
        print(line)

我收到以下错误:Unicode Error "unicodeescape" codec can't decode bytes in position 2-3.

我已经阅读了其他关于在文件路径前放置 'r' 的帖子,当我这样做时,我得到一个 "No such file or directory: 'c:\Users\username\Documents\ folder1\some_file.txt'

import os

file_path = r"c:\Users\username\Documents\folder1\some_file.txt"

with open(file_path, 'r') as f:
    for line in f:
        print(line)

我也尝试在路径 c:\\Users\\username\\Documents\\folder1\\some_file.txt 中使用双反斜杠,但也没有用。

我已尝试使用 pathlib 进行测试,但仍然出现 unicode 错误。

from pathlib import Path

file_path = "c:\Users\username\Documents\folder1\some_file.txt"

file_path = Path(file_path).absolute()

with open(fpath, 'r', encoding='utf-8') as f:
    line = f.readlines()
    for line in f:
        print(line)

【问题讨论】:

  • 双反斜杠的错误是什么?在普通的 Python 字符串中,\u 是 unicode 字符的开头,Python 无法解码,因为 \Users 和 \usern 不是有效的 unicode 字符。你确定你的文件路径是正确的吗?
  • @Altareos。错误是相同的“没有这样的文件或目录”。我已经确认文件路径是正确的。
  • 我愿意相信根本无法找到文件的错误消息。为了进行测试,请将文件移动到更简单的位置(例如 C: 驱动器的根目录)并使用该路径进行尝试。
  • 执行 os.listdir(r"c:\Users\username\Documents\folder1") 以查看 Python 在该目录中看到的确切内容 - 也许该文件实际上名为 some_file.txt.txt,并且 Windows 有助于隐藏其中一个扩展。
  • 只是为了确保...您并不是真的要查看名为 username 的文件夹,对吧?

标签: python python-3.x python-unicode


【解决方案1】:

更多信息:

正如Andrew Kaluzniacki's answer 正确指出的那样,问题出在路径字符串上。

使用 pathlib.Path

为了避免 Windows 路径和分隔符的麻烦,可以选择始终使用正斜杠,因为 open() 和 Windows 都有处理此问题的机制。

但是,为了向后兼容和健壮性,使用标准库中的pathlib.Path 可能会更好(仍然使用正斜杠作为路径分隔符)。 pathlib 自动将文件路径转换为适合您操作系统的路径。

最后,os.path.filesep() 返回主机操作系统的文件分隔符。

人们遇到类似问题的另一个潜在原因

文件中可能存在操作系统默认编码未涵盖的字符。

通过将不同的编码传递给open()encoding 参数来尝试其他编码。

您可以尝试open(file_path, 'r', encoding='utf-8'),尽管这应该是 Windows 10 的默认设置,假设这是基于您的文件路径示例的操作系统。

如果不知道文件中的内容,就很难知道哪种编码会起作用。

from pathlib import Path

fpath = Path(fpath).absolute()
# ^^ absolute() is not necessary if
# the file is in the same directory
# as the calling Python script
# and you just pass a filename.

with open(fpath, 'r', encoding='utf-8') as filehandle:
    do_something_with(filehandle)

【讨论】:

  • 编码问题来自路径字符串。尝试在您的解释器中输入"c:\Users\username\Documents\folder1\some_file.txt",您会看到同样的错误。
  • 我复制了 c:\Users\username\Documents\folder1\some)fille.txt" 并得到相同的 unicode 错误。我复制了c:\\Users\username\Documents\folder1\some)fille.txt",它被回显,没有错误
  • 要消除 Windows 路径分隔符的麻烦,您也可以只使用正斜杠。甚至 Windows 本身也能识别这些,包括资源管理器地址栏、cmd 解释器和 PowerShell。
  • @Altareos 啊,我忽略了这一点。我会调整答案。
  • 好问题。也许保留您所写的关于pathlib.Path 的内容,但添加有关正斜杠的信息作为另一种选择,并将两者组合在“更多信息”之类的标题下?
【解决方案2】:

在您的第一个示例中, file_path = "c:\Users\username\Documents\folder1\some_file.txt" \Users 中的 \U 表示 Unicode 转义序列,它试图将 sers 解码为 Unicode 字符,但事实并非如此。

在我的机器上,双反斜杠似乎可以工作 - 但当然我在那个路径上没有文本文件,所以我无法真正测试。

首先尝试为 \U 使用双反斜杠。

【讨论】:

  • 我为 \U c:\\Users\username\Documents\folder1\some_file.txt 尝试了双反斜杠并得到“没有这样的文件或目录”错误
猜你喜欢
  • 2017-04-27
  • 2013-08-19
  • 2010-11-23
  • 2023-02-22
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多