其次,该csv
模块不喜欢Python 2.7中的unicode字符串,因此在对数据进行解码之后,您需要将其转换回utf-8。
最后,csv.reader
在文件的各行上传递迭代,而不是其中包含换行符的大字符串。
所以:
csv.reader(f.read().decode('utf-8-sig').encode('utf-8').splitlines())
但是,您可能认为仅手动删除BOM会更简单/更有效:
def remove_bom(line):
return line[3:] if line.startswith(codecs.BOM_UTF8) else line
csv.reader((remove_bom(line) for line in f), dialect = 'excel', delimiter = ';')
这有一点不同,因为它从任何以“ 1”开头的行中删除了BOM,而不仅仅是第一行。如果您不需要保留其他BOM,那么可以使用以下方法进行修复:
def remove_bom_from_first(iterable):
f = iter(iterable)
firstline = next(f, None)
if firstline is not None:
yield remove_bom(firstline)
for line in f:
yield f