2011-01-10 15 views
6

StackOverflow'da Python'deki Unicode - CSV dönüşümü ile ilgili tüm soruları okudum ve halen kaygılarım var. Her seferinde, bir alma "UnicodeEncodeError: 'ASCII' kodek U 12'de 'Xd1 \' karakterini kodlayamayacağınız: aralıkta olmayan bir sıra (128),"Python: Unicode'ı ASCII'ye CSV dosyası için hatasız dönüştürün.

buffer=cStringIO.StringIO() 
writer=csv.writer(buffer, csv.excel) 
cr.execute(query, query_param) 
while (1): 
    row = cr.fetchone() 
    writer.writerow([s.encode('ascii','ignore') for s in row]) 

satır değeri

olduğu
(56, u"LIMPIADOR BA\xd1O 1'5 L") 

Burada veritabanında \ xd10 değeri ñ, İspanyolca olarak kullanılan bir aksa sahip. İlk önce değeri ascii'de geçerli bir şeye dönüştürmeye çalıştım ama çok fazla zaman kaybettikten sonra sadece bu karakterleri görmezden gelmeye çalışıyorum (sanırım aksanlı sesli harflerle aynı problemi yaşayacağım).

Değeri, ñ ("LIMPIADOR BAÑO 1'5 L") ile birlikte CSV'ye kaydetmek istiyorum, ancak mümkün değilse, en azından kaydetme ("LIMPIADOR BAO 1'5") L ").

+0

Sorunuz nedir? –

+0

Sonunda soruyla güncellendi. – Sergi

+1

Niçin yerel Windows 'ANSI' kod sayfanıza kodlamayı denemiyorsunuz? Windows kullandığınızı tahmin ediyorum çünkü CSV en çok Windows'da kullanılıyor, ancak bu işaretin genişliğiyse lütfen beni görmezden gelin. Bir * NIX İşletim Sisteminde sanırım 8 bitlik ISO kodlamasından biri uygun olurdu, ama ben uzman değilim. –

cevap

12

Doğru, ñ geçerli bir ASCII karakteri değil, bu yüzden ASCII'ye kodlayamazsınız. Yani, kodunuz yukarıdaki gibi, onları görmezden gelebilirsiniz. What is the best way to remove accents in a Python unicode string?

Ama her iki teknik iyi aksan tutmaktır Yani kelimeler aslında vb farklı bir şey, demek yapma gibi kötü etkilere neden olabilir unutmayın: Bir başka yöntem, yani aksan kaldırmak için, buradan bulabilirsiniz. Ve sonra ASCII kullanamazsınız, ancak başka bir kodlama kullanabilirsiniz. UTF-8 güvenli bahistir. Latin-1 veya ISO-88591-1, yaygın olanıdır, ancak yalnızca Batı Avrupa karakterlerini içerir. CP-1252, Windows, vb. Üzerinde yaygındır.

İstediğiniz kodlama için "ascii" yi değiştirin.

row = (56, u"LIMPIADOR BA\xd1O 1'5 L") 

writer.writerow([s.encode('utf8') if type(s) is unicode else s for s in row]) 

Şimdi, bu işe gerektiğine inanıyoruz, ama görünüşe göre öyle değil:


Gerçek kod, yorumunuzla göre olduğunu. Sanırım unicode yine de yanlış bir şekilde cvs yazara geçiyor. bu parçalar var o uzun çizgi kakışıyor: Artık gerçek hata aynı çizgide her şeyi sopa gerçeğiyle gizli olmayacak

col1, col2 = row # Use the names of what is actually there instead 
row = col1, col2.encode('utf8') 
writer.writerow(row) 

. Doğru bir geri dönüşe dahil olsaydınız bu durum muhtemelen önlenebilirdi.

+0

Çoğu CSV okuyucusu UTF-8'i işleyemiyor. CSV en çok Windows'ta okunur ve bu yüzden ANSI kodlamalarından biri en uygun olarak görünür. –

+0

Eh, "en" hakkında bilmiyorum, ama en azından bazıları. Ve CSV her yerde kullanılıyor. Açıkçası, hedef yazılım tarafından okunabilen bir kodlamanın kullanılması gerekmektedir. –

+0

Şey, unicode string u "LIMPIADOR BA \ xd1O 1'5 L" kullanarak yukarıdaki kodun, yukarıda da açıklandığı gibi UnicodeEncodeError hatasıyla sefil şekilde başarısız olmasıdır ("ignore" bayrağı çalışmıyor, neden bilmiyorum) .İdeal koşullarda ñ dahil olmak üzere tam dizeyle bir CSV dosyası almak istiyorum. – Sergi