首先,您需要解码文件内容,而不是对其进行编码。
其次,该
csv模块不喜欢Python 2.7中的unipre字符串,因此在对数据进行解码之后,您需要将其转换回utf-8。
最后,
csv.reader在文件的各行上传递迭代,而不是其中包含换行符的大字符串。
所以:
csv.reader(f.read().depre('utf-8-sig').enpre('utf-8').splitlines())但是,您可能认为仅手动删除BOM会更简单/更有效:
def remove_bom(line): return line[3:] if line.startswith(precs.BOM_UTF8) else linecsv.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



