【问题标题】:Trouble with UTF-8 CSV input in PythonPython 中 UTF-8 CSV 输入的问题
【发布时间】:2023-03-23 22:03:01
【问题描述】:

这看起来应该很容易解决,但到目前为止,我还没有找到解决方案。我有一个单列 csv 文件,其中保存在 utf-8 中的非 ascii 字符,我想读入并存储在列表中。我正在尝试遵循"Unicode Sandwich" 的原则并在读取文件时进行解码:

import codecs
import csv

with codecs.open('utf8file.csv', 'rU', encoding='utf-8') as file:
input_file = csv.reader(file, delimiter=",", quotechar='|')
list = []
for row in input_file:
    list.extend(row)

这会产生可怕的“编解码器无法在位置编码字符,序数不在范围内 (128)”错误。

我也尝试过采用this answer 的解决方案,但会返回类似的错误

def unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs):
    csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs)
    for row in csv_reader:
        yield [unicode(cell, 'utf-8') for cell in row]

filename = 'inputs\encode.csv'
reader = unicode_csv_reader(open(filename))
target_list = []
for field1 in reader:
    target_list.extend(field1)

改编自docs 的非常相似的解决方案返回相同的错误。

def unicode_csv_reader(utf8_data, dialect=csv.excel):
    csv_reader = csv.reader(utf_8_encoder(utf8_data), dialect)
    for row in csv_reader:
        yield [unicode(cell, 'utf-8') for cell in row]

def utf_8_encoder(unicode_csv_data):
    for line in unicode_csv_data:
    yield line.encode('utf-8')

filename = 'inputs\encode.csv'
reader = unicode_csv_reader(open(filename))
target_list = []
for field1 in reader:
    target_list.extend(field1)

显然我错过了一些东西。我看到的有关此问题的大多数问题似乎早于 Python 2.7,因此此处的更新可能会很有用。

【问题讨论】:

  • 错误消息表明它可能正在尝试将数据解码为 ASCII...
  • 你的第二个例子对我有用,也许你破坏了 csv 模块,我建议你升级你的 python?或者错误可能在其他地方
  • @AnttiHaapala 我的 Python 版本来自几周前干净的 Windows 安装,版本是 2.7.3。
  • 啊,所以你不是真的在做三明治。你得到了 Unicode,但在某些时候 Python 会尝试默默地将其转换为 ASCII。
  • 抱歉,John,试图将问题代码 sn-p 隔离在一个更大的脚本中,所以我已经注释掉了不相关的块。尝试仅将第二个 sn-p 移动到测试文件,错误似乎消失了。我将尝试逐步重建我的原始脚本,并将根据结果进行更新。

标签: python encoding utf-8


【解决方案1】:

您的第一个 sn-p 不起作用。您正在将 unicode 数据提供给 csv 阅读器,但(如文档所述)无法处理它。

您的第二个和第三个 sn-ps 混淆了。您只需要以下内容:

f = open('your_utf8_encoded_file.csv', 'rb')
reader = csv.reader(f)
for utf8_row in reader:
    unicode_row = [x.decode('utf8') for x in utf8_row]
    print unicode_row

【讨论】:

  • 这行得通。不确定我的原始脚本中究竟是什么导致了问题,但这就是生活。谢谢。
【解决方案2】:

如果从第一个字符读取失败,您可能有一个 BOM。如果您的文件是 UTF8 并且开头有 BOM,请使用 codecs.open('utf8file.csv', 'rU', encoding='utf-8-sig')

【讨论】:

    【解决方案3】:

    我建议尝试一下:

    input_file = csv.reader(open('utf8file.csv', 'r'), delimiter=",", quotechar='|')
    

    input_file = csv.reader(open('utf8file.csv', 'rb'), delimiter=",", quotechar='|')
    

    csv 应该可以识别 unicode,并且应该可以正常工作。

    【讨论】:

    • 它特别不支持 unicode,但是您的示例也没有使用 unicode。
    • 没有“utf-8 感知”之类的东西
    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多