gpt4 book ai didi

python - 带有python和fileinput的Unicode文件

转载 作者:太空狗 更新时间:2023-10-29 22:22:27 25 4
gpt4 key购买 nike

我越来越相信,文件编码业务是故意弄得尽可能困惑的。我在读取仅包含一行的 utf-8 编码文件时遇到问题:

“blabla this is some text”

(请注意引号是标准引号的一些奇特版本)。

现在,我在上面运行这段 Python 代码:

import fileinput
def charinput(paths):
with open(paths) as fi:
for line in fi:
for char in line:
yield char
i = charinput('path/to/file.txt')
for item in i:
print(item)

有两个结果:如果我从命令提示符运行我的 python 代码,结果是一些奇怪的字符,然后是一条错误消息:

ď
»
ż
â
Traceback (most recent call last):
File "krneki.py", line 11, in <module>
print(item)
File "C:\Python34\lib\encodings\cp852.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u20ac' in position
0: character maps to <undefined>

我认为问题出在 Python 试图读取“错误”编码的文档这一事实,但是有没有办法命令 fileinput.input 读取 utf- 8?


编辑:一些非常奇怪的事情正在发生,我NO不知道它是如何工作的。在 notepad++ 中保存与之前相同的文件后,python 代码现在在 IDLE 中运行并产生以下输出(已删除换行符):

“blabla this is some text”

如果我首先输入 chcp 65001,我可以让命令提示符不崩溃。运行文件然后导致

Ä»żâ€śblabla this is some text ”

有什么想法吗?如果你问我,这是一团糟,但我明白这一点至关重要......

最佳答案

编码

每个文件都经过编码。字节 0x4C 根据 ASCII 编码解释为拉丁文大写字母 L,但根据 EBCDIC 编码解释为小于号 ('<')。 没有纯文本这样的东西。

有单字节字符集,如 ASCII,使用单个字节对每个符号进行编码,有双字节字符集,如 KS X 1001,使用两个字节对每个符号进行编码,还有像流行的 UTF-8 这样的编码每个符号使用可变数量的字节。

UTF-8 已成为新应用程序最流行的编码,所以我将举一些例子: Latin Capital Letter A存储为单个字节:0x41Left Double Quotation Mark (") 存储为三个字节:0xE2 0x80 0x9C。表情符号 Pile of Poo存储为四个字节:0xF0 0x9F 0x92 0xA9

任何读取文件并必须将字节解释为符号的程序都必须知道(或猜测)使用了哪种编码。

如果您不熟悉 Unicode 或 UTF-8,您可能需要阅读 http://www.joelonsoftware.com/articles/unicode.html

在 Python 3 中读取文件

Python 3 的内置函数 open() 有一个可选的关键字参数 encoding 以支持不同的编码。要打开 UTF-8 编码的文件,您可以编写 open(filename, encoding="utf-8"),Python 将负责解码。

此外,fileinput 模块支持通过 openhook 关键字参数进行编码:fileinput.input(filename, openhook=fileinput.hook_encoded("utf-8"))

如果您不熟悉 Python 和 Unicode 或 UTF-8,您应该阅读 http://docs.python.org/3/howto/unicode.html我还在 http://www.chirayuk.com/snippets/python/unicode 中发现了一些不错的技巧

在 Python 2 中读取字符串

在 Python 2 中,open() 不知道编码。相反,您可以使用 codecs 模块来指定应使用哪种编码:codecs.open(filename, encoding="utf-8")

Python2/Unicode 启蒙的最佳来源是 http://docs.python.org/2/howto/unicode.html

关于python - 带有python和fileinput的Unicode文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24754861/

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