关于unicode:用于写入文本文件的python编码解码

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)

它现在起作用了,我非常感谢你的帮助!!


我猜您打开的输出文件是用latin1甚至utf-8编解码器打开的,因此您无法将utf-8编码的数据写入该文件,因为它试图重新转换该文件,否则您可以将任何任意数据字符串写入正常打开的文件,下面是一个重新创建类似错误的示例

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个条目。