मेरा समाधान थोड़ा अलग है। हालांकि उपर्युक्त सभी समाधान यूनिकोड संगत निर्देश रखने पर ध्यान केंद्रित कर रहे हैं, मेरे समाधान डिक्टवाइटर को यूनिकोड के साथ संगत बनाता है। पाइथन डॉक्स (1) में यह दृष्टिकोण भी सुझाया गया है।
कक्षाएं UTF8Recoder, यूनिकोड रीडर, यूनिकोडवाइटर पाइथन दस्तावेज़ से लिया जाता है। यूनिकोडवाइटर-> लेखक को थोड़ा सा बदल दिया गया था।
इसे नियमित डिक्टवाइटर/डिक्ट्रेडर के रूप में उपयोग करें। एक सरल अद्भुत UnicodeCSV मॉड्यूल का उपयोग कर वैकल्पिक हल नहीं है
import csv, codecs, cStringIO
class UTF8Recoder:
"""
Iterator that reads an encoded stream and reencodes the input to UTF-8
"""
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:
"""
A CSV reader which will iterate over lines in the CSV file "f",
which is encoded in the given encoding.
"""
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
f = UTF8Recoder(f, encoding)
self.reader = csv.reader(f, dialect=dialect, **kwds)
def next(self):
row = self.reader.next()
return [unicode(s, "utf-8") for s in row]
def __iter__(self):
return self
class UnicodeWriter:
"""
A CSV writer which will write rows to CSV file "f",
which is encoded in the given encoding.
"""
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
# Redirect output to a queue
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):
self.writer.writerow([unicode(s).encode("utf-8") for s in row])
# Fetch UTF-8 output from the queue ...
data = self.queue.getvalue()
data = data.decode("utf-8")
# ... and reencode it into the target encoding
data = self.encoder.encode(data)
# write to the target stream
self.stream.write(data)
# empty queue
self.queue.truncate(0)
def writerows(self, rows):
for row in rows:
self.writerow(row)
class UnicodeDictWriter(csv.DictWriter, object):
def __init__(self, f, fieldnames, restval="", extrasaction="raise", dialect="excel", *args, **kwds):
super(UnicodeDictWriter, self).__init__(f, fieldnames, restval="", extrasaction="raise", dialect="excel", *args, **kwds)
self.writer = UnicodeWriter(f, dialect, **kwds)
मैंने सोचा कि पायथन (x, y) 2.6.6.0 में डाउनग्रेड करना चीजों को आसान बना देगा। :) – endolith
@endolith: आप 'dict (v, v.encode ('utf-8') का उपयोग कर सकते हैं यदि isinstance (v, यूनिकोड) अन्य v) के लिए v, v.iteritems() में v) v के बजाए पायथन 2.6 पर समझ। – jfs
'अगर आईएसआईइंस्टेंस (वी, यूनिकोड)' हिस्सा आवश्यक है! – reubano