目前,csv模块不支持UTF-16。
在Python
3.x中,csv需要一个文本模式文件,您可以简单地使用encoding参数
open来强制进行另一种编码:
# Python 3.x onlyimport csvwith open('utf16.csv', 'r', encoding='utf16') as csvf: for line in csv.reader(csvf): print(line) # do something with the line在Python 2.x中,您可以重新编码输入:
# Python 2.x onlyimport precsimport csvclass Reprer(object): def __init__(self, stream, deprer, enprer, eol='rn'): self._stream = stream self._deprer = deprer if isinstance(deprer, precs.IncrementalDeprer) else precs.getincrementaldeprer(deprer)() self._enprer = enprer if isinstance(enprer, precs.IncrementalEnprer) else precs.getincrementalenprer(enprer)() self._buf = '' self._eol = eol self._reachedEof = False def read(self, size=None): r = self._stream.read(size) raw = self._deprer.depre(r, size is None) return self._enprer.enpre(raw) def __iter__(self): return self def __next__(self): if self._reachedEof: raise StopIteration() while True: line,eol,rest = self._buf.partition(self._eol) if eol == self._eol: self._buf = rest return self._enprer.enpre(line + eol) raw = self._stream.read(1024) if raw == '': self._deprer.depre(b'', True) self._reachedEof = True return self._enprer.enpre(self._buf) self._buf += self._deprer.depre(raw) next = __next__ def close(self): return self._stream.close()with open('test.csv','rb') as f: sr = Reprer(f, 'utf-16', 'utf-8') for row in csv.reader(sr): print (row)open并
precs.open要求文件以BOM表开头。如果没有(或者您使用的是Python 2.x),仍然可以在内存中进行转换,如下所示:
try: from io import BytesIOexcept importError: # Python < 2.6 from StringIO import StringIO as BytesIOimport csvwith open('utf16.csv', 'rb') as binf: c = binf.read().depre('utf-16').enpre('utf-8')for line in csv.reader(BytesIO(c)): print(line) # do something with the line


