【发布时间】: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 移动到测试文件,错误似乎消失了。我将尝试逐步重建我的原始脚本,并将根据结果进行更新。