如何优雅地打开 ASCII 文本

How to open a ASCII text graceful

当我用 Python 打开文件时很混乱。顺便说一句,我正在使用 python3.4.

首先它是一个日志文件(一个随时附加的巨大文件),所以iconv不可能。

Info1 file 是 ASCII 文本。

demo git:master ❯ file 1.log 
1.log: ASCII text, with very long lines

Info2 ipython 使用默认编码 'UTF-8':

打开它
 In [1]: f = open('1.log')
    In [2]: f.encoding
    Out[2]: 'UTF-8'

然后

第一次当我open('1.log', encoding='utf-8', mode='r')

ERROR: 'utf-8' codec can't decode byte 0xb1 in position 6435: invalid start byte

第二个当我open('1.log', encoding='ascii', mode='r')

ERROR: 'ascii' codec can't decode byte 0xe9 in position 6633: ordinal not in range(128)

如何在读取每一行的同时优雅地处理这个文件?

这是我在 github demo

上的演示

可能是 Windows CP 1252 或 Latin 1。尝试用以下方式打开它:

open('1.log', encoding='latin-1', 'rU')

看起来它不是 ascii 文件。编码测试通常是不准确的。尝试 chardet 它将为您检测编码。

然后

import chardet

filepointer = open(self.filename)
charset_detected = chardet.detect(filepointer.read())

请记住,这可能需要非常非常长的时间。在您尝试之前,我建议您先手动循环浏览明显的编码。

试试 UTF16 和 UTF32。然后尝试 Windows 编码。 Here is a list of several encodings.

我尝试了几种不同的编码组合,只需将脚本中的编码更改为 latin1,我就能够完全访问日志文件,因此 open('1.log', encoding='utf-8', mode='r') 行变为open('1.log', encoding='latin1', mode='r').