acp*_*eon 21 python encoding utf-8
这似乎应该是一个简单的解决方案,但到目前为止,我找不到解决方案.我有一个单列csv文件,其中非ascii字符保存在utf-8中,我想读入并存储在列表中.我试图遵循"Unicode三明治"的原则,并在读取文件时解码:
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)
Run Code Online (Sandbox Code Playgroud)
这会产生恐惧'编解码器无法对位置编码,顺序不在范围(128)'错误.
我也尝试过这个答案的解决方案,它会返回一个类似的错误
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)
Run Code Online (Sandbox Code Playgroud)
从文档改编的非常类似的解决方案返回相同的错误.
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)
Run Code Online (Sandbox Code Playgroud)
显然我错过了一些东西.我见过的关于这个问题的大多数问题似乎早于Python 2.7,所以这里的更新可能会有用.
Joh*_*hin 17
你的第一个片段不起作用.您正在将unicode数据提供给csv读取器,该读取器(如文档所述)无法处理它.
你的第2和第3个片段很混乱.您需要的就是以下内容:
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
Run Code Online (Sandbox Code Playgroud)
Bou*_*oud 12
在第一个char读取失败时,您可能有一个BOM.使用codecs.open('utf8file.csv', 'rU', encoding='utf-8-sig')
,如果你的文件是UTF8,并在开头一个BOM.
归档时间: |
|
查看次数: |
23129 次 |
最近记录: |