SORU
4 Aralık 2009, Cuma


UTF-8 Python 2.6 csv dosyaları için destek genel Unicode/

Python ile csv modülü UTF-8/Unicode söz konusu olunca düzgün çalışmıyor. Diğer web sayfalarında Python documentation ve, belirli durumlarda, iş parçacıkları buldum ama ne kadar idare ediyorsun anlamak ve uygun parçacığını kullanmak zorunda.

Nasıl ve dizeleri ve Unicode dizeleri okumak yazabilirim .csv "sadece" Python 2.6. çalışan dosyaları Ya bu basit bir çözümü olan Python 2.6 bir sınırlama var mı?

CEVAP
31 Mayıs 2011, Salı


Unicode http://docs.python.org/library/csv.html#examples verilen okumak için örnek kod Python 2.6 ve 2.7 ile çalışmıyor gibi eskimiş gibi görünüyor.

Burada utf-8 ile çalışır UnicodeDictReader izler ve diğer kodlamalar ile olabilir, ama ben sadece utf-8 giriş üzerinde denediler.

Kısacası fikir csv satır csv.reader alan bölündü sonra Unicode decode etmektir.

class UnicodeCsvReader(object):
    def __init__(self, f, encoding="utf-8", **kwargs):
        self.csv_reader = csv.reader(f, **kwargs)
        self.encoding = encoding

    def __iter__(self):
        return self

    def next(self):
        # read and split the csv row into fields
        row = self.csv_reader.next() 
        # now decode
        return [unicode(cell, self.encoding) for cell in row]

    @property
    def line_num(self):
        return self.csv_reader.line_num

class UnicodeDictReader(csv.DictReader):
    def __init__(self, f, encoding="utf-8", fieldnames=None, **kwds):
        csv.DictReader.__init__(self, f, fieldnames=fieldnames, **kwds)
        self.reader = UnicodeCsvReader(f, encoding=encoding, **kwds)

Kullanımı (kaynak dosya kodlama utf-8):

csv_lines = (
    "абв,123",
    "где,456",
)

for row in UnicodeCsvReader(csv_lines):
    for col in row:
        print(type(col), col)

Çıkış:

$ python test.py
<type 'unicode'> абв
<type 'unicode'> 123
<type 'unicode'> где
<type 'unicode'> 456

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CasinoRoyaleMovie's channel

    CasinoRoyale

    1 AĞUSTOS 2006
  • Jon Reed

    Jon Reed

    14 AĞUSTOS 2006
  • TheGamer2323

    TheGamer2323

    25 Ocak 2009