Python EncodingDecoding for writing to a text file
我真的花了很多时间在这上面,它慢慢地把我害死了。我已经从PDF中剥离了内容并将其存储在一个数组中。现在我正试图将它从数组中拉出来,并将其写入一个txt文件。但是,由于编码问题,我似乎无法实现它。
1 2 3 4 5 | allTheNTMs.append(contentRaw[s1:].encode("utf-8")) for a in range(len(allTheNTMs)): kmlDescription = allTheNTMs[a] print kmlDescription #this prints out fine outputFile.write(kmlDescription) |
我得到的错误是"unicodedecodeerror:ascii编解码器无法在位置213中解码字节0xc2:序号不在范围(128)内"。
我现在只是在胡闹,但我已经尝试了各种方法让这些东西写出来。
1 | outputFile.write(kmlDescription).decode('utf-8') |
请原谅我,如果这是基本的,我仍然在学习Python(2.7)。
干杯!
edit1:示例数据如下所示:
1 2 3 4 | Chart 3686 (plan, Morehead City) [ previous update 4997/11 ] NAD83 DATUM Insert the accompanying block, showing amendments to coastline, depths and dolphins, centred on: 34° 41′·19N., 76° 40′·43W. Delete R 34° 43′·16N., 76° 41′·64W. |
当我添加打印类型(原始)时,我得到
编辑2:当我尝试写入数据时,我收到原始错误消息(ASCII编解码器无法解码字节…)
我将查看建议的线程和视频。谢谢大家!
编辑3:我使用的是python 2.7
编辑4:AGF在下面的评论中一针见血,他注意到我是双重编码。我故意对以前工作过的字符串进行双重编码,并生成了最初抛出的相同错误消息。类似:
1 2 3 4 5 | text ="Here's a string, but imagine it has some weird symbols and whatnot in it - apparently latin-1" textEncoded = text.encode('utf-8') textEncodedX2 = textEncoded.encode('utf-8') outputfile.write(textEncoded) #Works! outputfile.write(textEncodedX2) #failed |
一旦我发现我尝试双重编码,解决方法如下:
1 2 3 4 5 | allTheNTMs.append(contentRaw[s1:].encode("utf-8")) for a in range(len(allTheNTMs)): kmlDescription = allTheNTMs[a] kmlDescriptionDecode = kmlDescription.decode("latin-1") outputFile.write(kmlDescriptionDecode) |
它现在起作用了,我非常感谢你的帮助!!
我猜您打开的输出文件是用
1 2 3 4 | u = u'??????????? ???????? ?????????? ' s = u.encode('utf-8') f = codecs.open('del.text', 'wb',encoding='latin1') f.write(s) |
输出:
1 2 3 4 5 6 7 8 | Traceback (most recent call last): File"/usr/lib/wingide4.1/src/debug/tserver/_sandbox.py", line 1, in <module> # Used internally for debug sandbox under external interpreter File"/usr/lib/python2.7/codecs.py", line 691, in write return self.writer.write(data) File"/usr/lib/python2.7/codecs.py", line 351, in write data, consumed = self.encode(object, self.errors) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128) |
解决方案:
如果不设置任何编解码器,这将有效
1 2 | f = open('del.txt', 'wb') f.write(s) |
另一个选项是直接写入文件而不编码Unicode字符串,如果输出文件已使用正确的编解码器打开,例如。
1 2 | f = codecs.open('del.text', 'wb',encoding='utf-8') f.write(u) |
您的错误消息似乎与任何Python语法都不相关,但实际上您正试图解码一个十六进制值,而这个值在UTF-8中没有等价的值。
十六进制0xc2表示一个拉丁字符-大写字母a,顶部带重音。因此,请尝试-
1 | allTheNTMs.append(contentRaw[s1:].encode("latin-1")) |
我不是Python专家,所以这可能不起作用,但似乎您正在尝试对拉丁字符进行编码。考虑到您也收到了错误消息,当尝试用UTF-8编码时,如果您的错误显示条目"0xc2"超出范围,实际上它超出了UTF-8的前128个条目,那么python只会查看前128个条目。