用于写入文本文件的Python编码\解码

时间:2012-03-27 19:40:13

标签: python unicode

我老老实实地花了很多时间在这上面,而且它正在慢慢地杀了我。我从PDF中删除了内容并将其存储在一个数组中。现在我试图将它从数组中拉回来并将其写入txt文件。但是,由于编码问题,我似乎无法实现它。

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)。

我现在只是乱搞,但我已经尝试了各种方法让这些东西写出来。

outputFile.write(kmlDescription).decode('utf-8')          

如果这是基本的,请原谅我,我还在学习Python(2.7)。

干杯!

EDIT1:示例数据类似于以下内容:

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在下面的评论中击中了头部。我试图故意对以前一直在工作的字符串进行双重编码,并产生与最初抛出的相同的错误消息。类似的东西:

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

一旦我发现我试图进行双重编码,解决方案如下:

allTheNTMs.append(contentRaw[s1:].encode("utf-8"))
for a in range(len(allTheNTMs)):
    kmlDescription = allTheNTMs[a]
    kmlDescriptionDecode = kmlDescription.decode("latin-1")
    outputFile.write(kmlDescriptionDecode)

现在正在工作,我非常感谢你的帮助!!

2 个答案:

答案 0 :(得分:4)

我的猜测是您打开的输出文件已使用latin1甚至utf-8编解码器打开,因此您无法将utf-8编码数据写入,因为它会尝试重新转换它,如果是正常打开的文件,你可以写任何数据字符串,这是一个重新创建类似错误的例子

u = u'सच्चिदानन्द हीरानन्द वात्स्यायन '
s = u.encode('utf-8')
f = codecs.open('del.text', 'wb',encoding='latin1')
f.write(s)

输出:

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)

<强>解决方案

如果你没有设置任何编解码器

,这将有效
f = open('del.txt', 'wb') 
f.write(s)

其他选项是直接写入文件而不编码unicode字符串,如果outputFile已使用正确的编解码器打开,例如

f = codecs.open('del.text', 'wb',encoding='utf-8')
f.write(u)

答案 1 :(得分:1)

您的错误消息似乎与您的任何Python语法无关,但实际上您正在尝试解码在UTF-8中没有等效的Hex值。

HEX 0xc2似乎代表一个拉丁字符 - 顶部有一个重音的大写字母A.因此,不要使用“allTheNTMs.append(contentRaw [s1:]。encode(”utf-8“))”,而是尝试: -

allTheNTMs.append(contentRaw[s1:].encode("latin-1"))

我不是Python的专家,所以这可能不起作用,但看起来你正试图编码一个拉丁字符。鉴于您收到的错误消息,似乎在尝试使用UTF-8编码时,Python只会查看前128个条目,因为您的错误似乎表明条目“0Xc2”超出范围,实际上它是在UTF-8的前128个条目中。