【问题标题】:Python Encoding\Decoding for writing to a text filePython Encoding\Decoding 用于写入文本文件
【发布时间】:2012-04-11 09:29:59
【问题描述】:

老实说,我在这方面花了很多时间,而且它正在慢慢杀死我。我已经从 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 codec can't decode byte 0xc2 in position 213:ordinal not in range (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 codec can't decode byte...)

我会查看建议的线程和视频。谢谢各位!

编辑 3:我使用的是 Python 2.7

编辑 4:当他注意到我是双重编码时,agf 在下面的 cmets 中一针见血。我尝试故意对以前工作的字符串进行双重编码,并产生与最初抛出的相同错误消息。比如:

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)

它现在正在运行,我非常感谢您的所有帮助!

【问题讨论】:

  • 请提供一些示例数据,您对此有疑问。并运行“type(raw_data)”并将结果粘贴到您的问题中
  • 如果你只是尝试write contentRaw 会发生什么?在我看来,数据已经被编码了。
  • 我使用codecs 模块解决了一些相同的问题,特别是codecs.open() 和codecs.write()。可能值得一看。
  • 你可能想看看这篇文章:stackoverflow.com/a/448383/1025391
  • contentRaw[s1:] 不是unicode 类型。当您在 bytes 对象上调用 .encode 时,Python2 使用 ascii 编解码器将 str 类型(包含字节序列)隐式解码为类型 unicode,然后将 unicode 编码为您提供的编码。见this pycon video

标签: python unicode


【解决方案1】:

我的猜测是您打开的输出文件已使用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)

【讨论】:

  • 谢谢 - 我尝试这样做只是为了得到错误“typeerror:encoding is an invalid keyword argument for this function)”。看起来像从 Python 3 开始的编码打开,我使用的是 2.7。我应该指定这一点,并将编辑我的问题。
  • @gruvn 我使用的是 python 2.7,你将编码传递给哪个函数?使用 codecs.open
  • 哦废话 - 对不起 Anurag - 我在尝试: f=open('del.text','wb',encoding='utf-8') 而不是 f=codecs.open('del .text','wb',encoding='utf-8') 我再看看。 PS:抱歉格式化,我无法让代码标签工作!
  • 嗯,还是没有运气。当我尝试outputFile = codecs.open(outputFileName, "wb",encoding='utf-8') 时,我只收到消息 - “NameError: global name 'codecs' is not defined”
  • @gruvn 你导入编解码器模块了吗?您需要在使用它之前导入 nay 模块,例如import codecs我建议你先看python教程
【解决方案2】:

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

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

【讨论】:

  • UTF-8 可以表示任何 unicode 码位,所以问题是他试图对数据进行双重编码,而不是目标编码。
  • 这是不正确的。他正在调用 .encode 方法并得到一个 Unicode Decode 错误。这意味着 python2 的隐式 str/unicode 转换正在进行。
猜你喜欢
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多