Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 读取文本文件的行并获取charmap解码错误_Python_File_Python 3.x_Text Files_Decode - Fatal编程技术网

Python 读取文本文件的行并获取charmap解码错误

Python 读取文本文件的行并获取charmap解码错误,python,file,python-3.x,text-files,decode,Python,File,Python 3.x,Text Files,Decode,我正在使用python3.3和sqlite3数据库。我有一个大约270mb大的文本文件,可以在Windows7中用写字板打开 该文件中的每一行如下所示: f = open('sorted.de.word.unigrams', "r") for line in f: #code 术语\t编号\n 我想读取每一行并将值保存在数据库中。我的代码如下所示: f = open('sorted.de.word.unigrams', "r") for line in f: #code

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

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

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

    #code
术语\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>
文件“C:\projects\datatest.py”,第18行,在
对于f中的行:
文件“c:\python33\lib\encodings\cp1252.py”,第23行,解码
返回编解码器.charmap\u解码(输入、自身错误、解码表)[0]
UnicodeDecodeError:“charmap”编解码器无法解码位置140中的字节0x81:字符映射到
我试图用encoding=utf-8打开该文件,但即使是其他编解码器也无法工作。 然后我试图通过另存为utf-8 txt文件用写字板复制。但是写字板崩溃了

这里的问题在哪里,这行中似乎有一些python无法处理的字符。 我该怎么做才能完全读取我的文件?或者可以忽略这些错误信息,继续下一行吗

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

非常感谢

试试看

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

我检查了该文件,问题的根源似乎是该文件包含至少两种编码的单词:可能是cp1252和cp850。字符0x81在cp850中为
u
,但在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

这通常发生在编码不匹配时

0x81
没有任何意义,请尝试指定编码

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

您可以尝试直接将文件导入sqlite3而不使用python。。。但对我来说,这不是一个好的解决方案,因为在将值写入数据库之前,我必须在数字中添加一些数字,我必须使用python来决定这些数字。因此,我仍然在通过python寻找另一种解决方案。请参见,您需要使用
encoding=…