Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 如何阅读®;从Windows-1252文件中提取字符并写入UTF-8文件_Python_Python 2.7_Utf 8 - Fatal编程技术网

Python 如何阅读®;从Windows-1252文件中提取字符并写入UTF-8文件

Python 如何阅读®;从Windows-1252文件中提取字符并写入UTF-8文件,python,python-2.7,utf-8,Python,Python 2.7,Utf 8,我有一个Windows-1252编码的输入文件,其中包含“®”字符。我需要将此字符写入UTF-8文件。还假设我必须使用Python 2.7。看起来很容易,但我总是会犯错误 我最初刚使用UTF-8编码的codecs.open()打开了原始文件,在遇到®符号之前,它对所有ASCII字符都能正常工作,因此出现错误: UnicodeDecodeError: 'utf8' codec can't decode byte 0xae in position 2867043: invalid start by

我有一个Windows-1252编码的输入文件,其中包含“®”字符。我需要将此字符写入UTF-8文件。还假设我必须使用Python 2.7。看起来很容易,但我总是会犯错误

我最初刚使用UTF-8编码的
codecs.open()
打开了原始文件,在遇到®符号之前,它对所有ASCII字符都能正常工作,因此出现错误:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xae in position 2867043: 
invalid start byte
我知道我必须正确地将其解码为cp1252才能解决这个问题,所以我以正确的编码打开它,然后在写入之前将数据编码为UTF-8。但这产生了一个新的错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 22: 
ordinal not in range(128)
以下是一个最低限度的工作示例:

with codecs.open('in.txt', mode='rb', encoding='cp1252') as inf:
    with codecs.open('out.txt', mode='wb', encoding='utf-8') as of:
        for line in inf:
            of.write(line.encode('utf-8'))
以下是.txt中
的内容:

Sample file

Here is my sample file® yay.
我想也许我可以在没有指定编码的“rb”模式下打开它,并专门处理每行的解码和编码,如下所示:

of.write(line.decode('cp1252').encode('utf-8'))
但这也不起作用,产生了与我刚刚以UTF-8打开它时相同的错误


如何从Windows-1252文件中读取数据,对其进行正确解码,然后将其编码为UTF-8并将其写入UTF-8文件?在我遇到®字符之前,上述方法一直适用于我。

如果0xC2应表示
字符,则您的文件不在Windows-1252中;在Windows-1252中,0xC2是

但是,您应该只使用

of.write(line)

由于正确编码是您首先使用
编解码器的全部原因。

这解决了问题,但您能帮我更好地理解一下吗。编解码器是否以某种方式为我处理编码?顺便说一句,我会接受这一点,但它不会让我多呆几分钟。@BobDylan:是的,动态执行en/解码是编解码器包的工作。阅读文档!是的,我试着了解更多,但文档似乎只记录了所有的方法。对于它是如何工作的,没有一个真正的(低级)描述。如果您有任何链接可以进一步解释它,而不仅仅是列出所有的方法,并简要描述它们的作用,而不是它们如何工作,我很想了解更多。如果不是,那没什么大不了的,这是公认的答案,我很感谢您的时间。@BobDylan:真的,只有文档:
codecs.open(文件名、模式[、编码[、错误[、缓冲]]])
使用给定模式打开编码文件并返回提供透明编码/解码的包装版本。这告诉我它是做什么的,而不是它是如何做的。但即便如此,它仍然有效。我只是希望能学到更多。谢谢