【问题标题】:How to get the non-ASCII letters from a file, without them being "corrupted"?如何从文件中获取非 ASCII 字母,而不会将它们“损坏”?
【发布时间】:2017-11-09 15:31:10
【问题描述】:

我想知道如何从非 ASCII 编码中读取字母,而不会“损坏”它们。

这里是娱乐:

print(open("somefile.txt").read())

somefile.txt(保存为 unicode)

čđža

我得到的是这样的:

ÿþ ~a

如何获取文件的原始内容?

【问题讨论】:

  • 'saved as unicode' 并不能真正告诉您如何正确读取文件,您需要知道编码。
  • @pvg 我对编码不太擅长,如何检查它是哪种编码?
  • 你是如何创建这个文件的?您的典型文本编辑器将向您显示编码。然后,您可以将其作为命名参数传递给open,它在文档中。
  • 我只是喜欢在记事本中创建它,保存时它说我不应该选择ANSI,所以我将它设置为unicode。我没有看到其他任何东西。
  • 下载 sublime 或 notepad++ 之类的,notepad 使用奇怪的术语。任何认真的编辑都会在状态行显示编码。

标签: python python-3.x


【解决方案1】:

您以cp1252 的身份打开文件,您应该以utf-16 的身份打开它。

ÿþ 表示 UTF-16LE 字节顺序标记被错误地解释为 Windows-1252。)

>>> open('foo.txt', encoding='utf-16').read()
'čđža'
>>> open('foo.txt', encoding='cp1252').read()
'ÿþ\n\x01\x11\x01~\x01a\x00'

在 unix 系统上,您可以使用 file 查看文件中的内容:

~$ file foo.txt
foo.txt: Little-endian UTF-16 Unicode text, with no line terminators

在 Python 中,chardet 库非常适合:

>>> chardet.detect(open('foo.txt', 'rb').read())
{'encoding': 'UTF-16', 'confidence': 1.0, 'language': ''}

【讨论】:

  • 我只有一个关于 chardet 的问题,它说它是一个无效的模块。当我尝试使用“pip install chardet”安装它时,它说要求已经满足,之后不做任何事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多