2012-03-27 49 views
1

我老老实实地在这上面花了很多时间,并且它正在慢慢地杀死我。我从PDF中剥离了内容并将其存储在一个数组中。现在我试图将其从数组中拉出并写入一个txt文件。但是,由于编码问题,我似乎无法做到这一点。Python编码用于写入文本文件的解码

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

请提供一些样品数据,你有问题。并运行“type(raw_data)”并将结果粘贴到您的问题中 – pylover 2012-03-27 19:45:35

+1

如果您只是尝试“写入”contentRaw,会发生什么情况?它看起来像数据已经编码。 – agf 2012-03-27 19:51:59

+0

我使用'codecs'模块解决了一些相同的问题,特别是'codecs.open()'和'codecs.write()'。值得一看。 – heltonbiker 2012-03-27 19:59:44

回答

1

你的错误消息似乎并没有出现涉及到任何你的Python语法,但实际上事实你试图解码其中有UTF-8没有等效十六进制值。为0xC2出现

HEX表示一个拉丁字符 - 在顶部重音的大写字母A。因此,与其使用“allTheNTMs.append(contentRaw [S1:]编码(” UTF-8 “))”,尝试: -

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

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

+1

UTF-8可以代表任何unicode代码点,所以问题是他试图对数据进行双重编码,而不是目标编码是什么。 – agf 2012-03-27 20:04:32

+0

这是不正确的。他正在调用**'.encode' **方法并得到一个Unicode **解码**错误。这意味着python2的隐式str/unicode转换正在进行。 – Daenyth 2012-03-27 20:29:03

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) 
+0

谢谢 - 我试过这只是为了得到错误“typeerror:编码是一个无效的关键字参数为这个函数)”。看起来像用Python 3开始的编码打开,我使用2.7。我应该详细说明,并编辑我的问题。 – gruvn 2012-03-28 19:28:08

+0

@gruvn我正在使用Python 2.7,你正在传递的编码函数?使用codecs.open – 2012-03-28 20:10:43

+0

哦,废话 - 对不起阿努拉格 - 我是想: F =开放( 'del.text', 'WB',编码= 'UTF-8')的 代替 F = codecs.open( 'del.text','wb',encoding ='utf-8') 我会再看一次。 PS:抱歉格式化,我无法使代码标签正常工作! – gruvn 2012-03-29 11:20:30