gpt4 book ai didi

python - 在 python 中读取一个 unicode 文件,它以与 python 源代码相同的方式声明其编码

转载 作者:太空狗 更新时间:2023-10-29 20:14:47 24 4
gpt4 key购买 nike

我想编写一个 python 程序来读取包含 unicode 文本的文件。这些文件通常使用 UTF-8 编码,但也可能不是;如果不是,则替代编码将在文件开头明确声明。更准确地说,它将使用与 Python 本身使用的规则完全相同的规则来声明,以允许 Python 源代码具有显式声明的编码(如 PEP 0263 中,有关更多详细信息,请参阅 https://www.python.org/dev/peps/pep-0263/)。需要明确的是,正在处理的文件实际上并不是 python 源代码,但它们确实使用相同的规则声明了它们的编码(当不是 UTF-8 时)。

如果在打开文件之前知道文件的编码,Python 提供了一种非常简单的方法来读取带有自动解码的文件:codecs.open 命令;例如,一个人可能会这样做:

import codecs
f = codecs.open('unicode.rst', encoding='utf-8')
for line in f:
print repr(line)

我们在循环中得到的每一行 line 都是一个 unicode 字符串。是否有一个 Python 库做类似的事情,但根据上述规则(我认为这是 Python 3.0 的规则)选择编码? (例如,Python 是否公开了它用来读取语言源代码的“使用 self 声明编码的读取文件”?)如果没有,达到预期效果的最简单方法是什么?

一个想法是使用通常的open 打开文件,读取前两行,将它们解释为 UTF-8,使用 PEP 中的正则表达式查找编码声明,如果有发现一个开始使用声明的编码解码所有后续行。为了确保它能正常工作,我们需要知道对于 Python 源代码中 Python 允许的所有编码,通常的 Python readline 会正确地将文件拆分成行——也就是说,我们需要知道对于 Python 源代码中 Python 允许的所有编码,字节字符串 '\n' 总是真正意味着换行符,并且不是编码另一个字符的一些多字节序列的一部分。 (事实上​​我也需要担心'\r\n'。)有谁知道这是不是真的?文档不是很具体。

另一个想法是查看 Python 源代码。有谁知道源代码编码处理在 Python 源代码的哪个位置完成?

最佳答案

您应该能够在 Python 中推出自己的解码器。如果您只支持作为 ASCII 超集的 8 位编码,则下面的代码应该按原样工作。

如果需要支持2字节encodings like UTF-16您需要扩充模式以匹配 \x00c\x00o.. 或相反,具体取决于 the byte order mark .首先,生成一些宣传其编码的测试文件:

import codecs, sys
for encoding in ('utf-8', 'cp1252'):
out = codecs.open('%s.txt' % encoding, 'w', encoding)
out.write('# coding = %s\n' % encoding)
out.write(u'\u201chello se\u00f1nor\u201d')
out.close()

然后编写解码器:

import codecs, re

def open_detect(path):
fin = open(path, 'rb')
prefix = fin.read(80)
encs = re.findall('#\s*coding\s*=\s*([\w\d\-]+)\s+', prefix)
encoding = encs[0] if encs else 'utf-8'
fin.seek(0)
return codecs.EncodedFile(fin, 'utf-8', encoding)

for path in ('utf-8.txt','cp1252.txt'):
fin = open_detect(path)
print repr(fin.readlines())

输出:

['# coding = utf-8\n', '\xe2\x80\x9chello se\xc3\xb1nor\xe2\x80\x9d']
['# coding = cp1252\n', '\xe2\x80\x9chello se\xc3\xb1nor\xe2\x80\x9d']

关于python - 在 python 中读取一个 unicode 文件,它以与 python 源代码相同的方式声明其编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6078902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com