В конце csv module documentation приведен пример, который демонстрирует, как работать с Unicode. Ниже скопировано прямо из этого example. Обратите внимание, что строки, считанные или записанные, будут строками Unicode. Не передавайте байтовую строку на UnicodeWriter.writerows
, например.
import csv,codecs,cStringIO
class UTF8Recoder:
def __init__(self, f, encoding):
self.reader = codecs.getreader(encoding)(f)
def __iter__(self):
return self
def next(self):
return self.reader.next().encode("utf-8")
class UnicodeReader:
def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds):
f = UTF8Recoder(f, encoding)
self.reader = csv.reader(f, dialect=dialect, **kwds)
def next(self):
'''next() -> unicode
This function reads and returns the next line as a Unicode string.
'''
row = self.reader.next()
return [unicode(s, "utf-8") for s in row]
def __iter__(self):
return self
class UnicodeWriter:
def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds):
self.queue = cStringIO.StringIO()
self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
self.stream = f
self.encoder = codecs.getincrementalencoder(encoding)()
def writerow(self, row):
'''writerow(unicode) -> None
This function takes a Unicode string and encodes it to the output.
'''
self.writer.writerow([s.encode("utf-8") for s in row])
data = self.queue.getvalue()
data = data.decode("utf-8")
data = self.encoder.encode(data)
self.stream.write(data)
self.queue.truncate(0)
def writerows(self, rows):
for row in rows:
self.writerow(row)
with open('xxx.csv','rb') as fin, open('lll.csv','wb') as fout:
reader = UnicodeReader(fin)
writer = UnicodeWriter(fout,quoting=csv.QUOTE_ALL)
for line in reader:
writer.writerow(line)
ввода (UTF-8 закодированы):
American,美国人
French,法国人
German,德国人
Выход:
"American","美国人"
"French","法国人"
"German","德国人"
вы можете закодировать его в base64, у pythn есть модуль для этого тоже. – PepperoniPizza
Я использую этот https://github.com/jdunck/python-unicodecsv –
Какую кодировку источника и назначения вы используете для своих файлов? Unicode не является кодировкой (если вы не Microsoft ... но они действительно означают UTF-16LE). –