【问题标题】:Read Dot Files in Python在 Python 中读取点文件
【发布时间】:2015-12-02 06:43:55
【问题描述】:

我正在尝试读取包含以下内容的点文件:

graph {
    KZJLCHYE -- DJTGWUZZ;
    PNLWKOXF -- BFSIOMPY;
    ...
}

但是当我尝试读取点文件时,我得到“UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 0: invalid continuation byte”。有没有一种方法可以仅使用标准库在 Python 中读取点文件的内容?

【问题讨论】:

  • 您能否将文件的前几个(原始)字节添加到您的问题中?类似hexdump -C -n 16 yourfile.dot
  • @JeremyKerr 这里是原始字节:00000000 d0 cf 11 e0 a1 b1 1a e1 00 00 00 00 00 00 00 00 |................ | 00000010

标签: python dot


【解决方案1】:

文本文件的编码是一个永远无法完全解决的模糊主题。您要么需要猜测编码,要么手头上有损坏的(或二进制)文件:

  1. 要猜测编码,请尝试在任何高级文本编辑器中打开它,查看它是否为您猜测编码和/或突出显示有问题的字符。

  2. 如果你不关心位置 0 的坏字符,你可以指示 python 忽略它。见 Python3 手册:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)——只需设置errors='ignore' Python3 比 python2 更好地处理编码,所以如果你提到你使用的版本会有所帮助。

  3. 将文件作为二进制流读取并在将其转换为str时处理坏字符:open(file, 'rb')。同样,您的解码选项取决于 python 版本,因此我无法进一步详细说明。

【讨论】:

  • 我正在使用 Python3。我忽略了错误,但没有读取文件中的任何内容。我假设这是因为整个文件都会引发错误。我也尝试读取二进制流并转换回字符串,但我得到难以辨认的输出 ()。
  • @sikez 您可能正在尝试以错误的编码读取。例如:如果它试图读取一个 3 字节的 UTF-8 字符,但实际上文本是用 4 字节的 UTF-32 字符编码的,那么你肯定会弄错每个字符的偏移量。看我的步骤 1:在一个好的编辑器中打开它(我使用 emacs),它会猜测编码名称。您还可以使用 python 库chardet 来猜测编码。也可以试试一些主流的:open(file, encoding='latin-1'),open(file, encoding='utf-16'),open(file, encoding='utf-32')...
  • 非常感谢!我使用了chardet,发现编码实际上是ISO-8859-2。
  • 您可能将文本与“我们不需要标准”软件生成的一些二进制数据混合在一起。由于 ISO-8859-2 是一个 1 字节编解码器,它的失败表明文本是以多字节 unicode 之一编码的,因此无法自动解码,因为混合在二进制数据中总是会破坏字符边界检测。您最好的选择是以二进制形式读取它并尝试在解码之前手动隔离二进制部分。 P.S.:另外,如果任何文本编辑器都可以正确读取你的文件,那么我上面的推理是无效的:自动解码是可能的,你犯了一个错误。
【解决方案2】:

要忽略文件中的 unicode 字符,您可以这样做

var = unicode(var, errors='ignore')

【讨论】:

  • 我认为@sikez 的意思是“点”,就像在基于文本的图形格式中一样,而不是像用户主目录中以. 为前缀的文件中的“点”。
猜你喜欢
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 2016-10-17
  • 2020-11-03
相关资源
最近更新 更多