【问题标题】:Converting ISO-8859-1 to utf-8 (øæå)将 ISO-8859-1 转换为 utf-8 (øæå)
【发布时间】:2014-09-30 09:23:45
【问题描述】:

我有一个包含字母 ('øæå') 的 txt 文档,我希望这个脚本能够识别这些字母并将它们正确地写入 csv 文件。

with codecs.open('transaksjonliste.txt', 'r', 'ISO-8859-1') as file:
    for line in file:

        line = file.readline() 
        lineS = line.encode('ISO-8859-1', 'ignore').decode('utf-8')
        splitTab = lineS.split(';')

        for s in splitTab:
            newS = s[1:-1]

        date = splitTab[0].replace('.', '/')
        insertList = [date,]
        out.writerow(date)

给予:

  File "Q:\DropBox\Development\Scripts\tes2.py", line 17, in <module>
    lineS = line.encode('ISO-8859-1', 'ignore').decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf8 in position 14: invalid start byte

【问题讨论】:

  • 为什么你们都在循环调用readline()?为什么先编码为 Latin-1,然后再从 UTF-8 解码?您的数据没有错误编码,奇怪的舞蹈是导致您异常的原因。
  • 你也忽略了insertList,也没有告诉我们out是什么;那是csv.writer() 对象吗?
  • 对不起我的无知。不知道不需要调用 readline()。 @MartijnPieters insertList 正在进行中,但不应该是这里的问题。是的,输出是一个 csv.writer() 对象。感谢提醒

标签: python csv unicode latin1


【解决方案1】:
with codecs.open('transaksjonliste.txt', 'r', 'ISO-8859-1') as file:
    for line in file:

        line = file.readline() 
        lineS = line.encode('ISO-8859-1', 'ignore').decode('utf-8')
        splitTab = lineS.split(';')

删除 line = file.readline() ,您已经在使用 for line in file 构造迭代(读取)行。

lineS = line.encode('ISO-8859-1', 'ignore').decode('utf-8')

不会是您想要的,因为它会编码为 ISO-8859-1,然后尝试将 ISO-8859-1 解码为 UTF-8。如果您想将“ISO-8859-1”转换为 UTF-8,通常需要这样做

 lineS = line.decode('ISO-8859-1', 'ignore').encode('utf-8')

但是,您已经在 codecs.open() 表达式中将数据从“ISO-8859-1”(转换为 unicode)。所以你只需要做

  lineS = = line.encode('utf-8')

【讨论】:

    猜你喜欢
    • 2011-08-01
    • 1970-01-01
    • 2014-08-29
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多