Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取Python中的点文件_Python_Dot - Fatal编程技术网

读取Python中的点文件

读取Python中的点文件,python,dot,Python,Dot,我正在尝试读取包含以下内容的点文件: graph { KZJLCHYE -- DJTGWUZZ; PNLWKOXF -- BFSIOMPY; ... } 但当我尝试读取该点文件时,我得到“UnicodeDecodeError:'utf-8'编解码器无法解码位置0处的字节0xd0:无效的继续字节”。有没有一种方法可以仅使用标准库读取Python中点文件的内容 要忽略文件中的unicode字符,可以执行以下操作 var = unicode(var, errors='igno

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

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

但当我尝试读取该点文件时,我得到“UnicodeDecodeError:'utf-8'编解码器无法解码位置0处的字节0xd0:无效的继续字节”。有没有一种方法可以仅使用标准库读取Python中点文件的内容

要忽略文件中的unicode字符,可以执行以下操作

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

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

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

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

  • 将文件作为二进制流读取,并在将其转换为
    str
    时处理错误字符:
    open(文件'rb')
    。同样,您的解码选项取决于python版本,因此我无法进一步阐述


  • 我认为@sikez在基于文本的图形格式中是“点”的意思,而不是在用户主目录中前缀为
    的文件中是“点”的意思。您能将文件的前几个(原始)字节添加到您的问题中吗?类似于
    hextump-C-n16 yourfile.dot
    @JeremyKerr这里是原始字节:00000000d0 cf 11 e0 a1 b1 1a e10000我正在使用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中,因此无法进行自动解码,因为混入的二进制数据总是会破坏字符边界检测。最好的办法是以二进制读取,并尝试在解码之前手动隔离二进制部分。另外,如果任何文本编辑器都能正确读取您的文件,那么我上面的推理是无效的:自动解码是可能的,而您犯了一个错误。