【问题标题】:How to open a ASCII text graceful如何优雅地打开一个 ASCII 文本
【发布时间】:2015-05-28 00:34:55
【问题描述】:

当我用 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')

错误:'utf-8' 编解码器无法解码位置 6435 中的字节 0xb1:无效起始字节

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

错误:'ascii' 编解码器无法解码位置 6633 中的字节 0xe9:序数 不在范围内(128)

如何在读取每一行时优雅地处理此文件?

这是我在 github 上的演示 demo

【问题讨论】:

  • 您知道文件的实际编码吗?考虑到它包含 0xE9 字节,它绝对是 not ASCII 文件。
  • 您可以使用file magic for Python 来获取有关您正在使用的文件及其编码的更多信息。
  • @dlask 这是 F5 博客,我真的不知道是哪种编码。 file 命令是否只检测文件的开头?

标签: python encoding utf-8


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    可能是 Windows CP 1252 或 Latin 1。尝试使用以下命令打开它:

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

    【讨论】:

      【解决方案3】:

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

      然后

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-07
        • 2018-12-07
        • 2013-12-20
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        • 2022-08-11
        • 1970-01-01
        相关资源
        最近更新 更多