【问题标题】:Read lines of a textfile and getting charmap decode error读取文本文件的行并获得charmap解码错误
【发布时间】:2017-06-06 17:41:33
【问题描述】:

我使用 python3.3 和 sqlite3 数据库。我有一个大约 270mb 的大文本文件,我可以在 Windows7 中使用写字板打开它。

该文件中的每一行如下所示:

术语\t编号\n

我想读取每一行并将值保存在数据库中。我的代码如下所示:

f = open('sorted.de.word.unigrams', "r")
for line in f:

    #code

我能够将所有数据读入我的数据库,但只是到某一行,我建议可能是所有行的一半。然后我得到以下错误:

File "C:\projects\databtest.py", line 18, in <module>
for line in f:
File "c:\python33\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 140: character maps to   <undefined>

我尝试使用 encoding = utf-8 打开文件,但即使是其他编解码器也没有任何效果。 然后我尝试通过另存为 utf-8 txt 文件使用写字板制作副本。但是写字板崩溃了。

问题出在哪里,看起来该行中有一些python无法处理的字符。 我该怎么做才能完全阅读我的文件?或者是否可以忽略此类错误消息并继续下一行?

您可以在此处下载打包文件:

http://wacky.sslmit.unibo.it/lib/exe/fetch.php?media=frequency_lists:sorted.de.word.unigrams.7z

非常感谢!

【问题讨论】:

  • 你可以尝试不使用python直接将文件导入sqlite3。
  • 我现在正在尝试使用 SQLite 数据库浏览器,它需要很长时间......但对我来说这不是一个好的解决方案,因为在将值写入数据库之前,我必须在数字上添加一些数字什么我必须决定用python。所以我仍然通过python寻找另一种解决方案。
  • stackoverflow.com/a/9233174/14420,需要用encoding=...打开

标签: python file python-3.x text-files decode


【解决方案1】:

我检查了文件,问题的根源似乎是文件包含至少两种编码的单词:可能是 cp1252 和 cp850。字符 0x81 在 cp850 中是 ü,但在 cp1252 中未定义。您可以通过捕获异常来处理这种情况,但其他一些德语字符映射到 cp1252 中有效但错误的字符。如果您对这样一个不完美的解决方案感到满意,您可以这样做:

with open('sorted.de.word.unigrams','rb') as f: #open in binary mode
    for line in f:
        for cp in ('cp1252', 'cp850'):
            try:
                s = line.decode(cp)
            except UnicodeDecodeError:
                pass
            else:
                store_to_db(s)
                break

【讨论】:

    【解决方案2】:

    这通常发生在encoding 不匹配时。

    0x81不代表什么,试试指定编码

    file = open(filename, encoding="utf8")
    

    【讨论】:

      【解决方案3】:

      试试

      data = []
      import codecs
      with codecs.open('sorted.de.word.unigrams', 'r') as f:
          for line in f:
               data.append(line)
      

      如果你想忽略错误,你可以这样做

      try:
          # Your code that enter data to database
      except UnicodeDecodeError:
          pass
      

      【讨论】:

        猜你喜欢
        • 2019-05-21
        • 2019-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-04
        • 2019-05-25
        • 1970-01-01
        相关资源
        最近更新 更多