2011-01-13 7 views
6

içine Python bilinmeyen kodlamayla Dosya alınıyor.Python HTTP üzerinden bir sekme ile sınırlandırılmış dosyasını içe üzerinde çalışmak MongoDB

MongoDB içine satırın veri ekleme önce, eğik çizgi kaldırarak ediyorum, kene ve ipten tırnak. olduğunca çabuk elimden geldiği kadar ben istiyorum yaptığım okuma, bu sorunu çözmek için bir çaba içinde Yani

bson.errors.InvalidStringData: strings in documents must be valid UTF-8 

: bilginin kodlanması MongoDB bana istisna atıyor ne olursa olsun

, unicode() işlevini kullanarak satırın verilerini Unicode'a dönüştürün. Buna ek olarak, ilk parametre olarak kod çözme() fonksiyonu geçen "unicode" çağıran denedi ama hata alırsınız: Böyle eğik çizgi yerine olarak benim dize manipülasyonlar yapabilir, Oradan

LookupError: unknown encoding: unicode 

, keneler ve tırnak. Sonra verileri MongoDB'ye yerleştirmeden önce, str.encode ('utf-8') fonksiyonunu kullanarak UTF-8'e dönüştürün.

Sorun: Unicode için dönüştürürken, ben bu hata ile hata

UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 1258: ordinal not in range(128) 

alıyorum, ben devam etmek tam olarak nerede emin değilim. Nasıl başarıyla kodlama bilmeden bir dosyadan veri almak yoktur ve başarılı UTF-8 gerektirir MongoDB, takın:

Sorum şudur?

sayesinde çok!

+0

Bu neden etiketli "csv" this article okuma düşünün? –

+0

Ancak "HTTP üzerinden sekmeyle ayrılmış bir dosya içe aktarılıyor" dediniz ... "CSV" buna uygun mu? –

cevap

7

için bu deneyin:

(0) bölü Kaldırma// vb verileri katlederken değildir keneler emin olun. Bir kene nedir? Lütfen kodunuzu gösterin. Lütfen ham verilerin bir örneğini gösteriniz ... print repr(sample_raw data) kullanın ve çıktıyı kopyalayıp sorunuzun bir düzenlemesine yapıştırın.

(1) Eski bir Maxim var: "Bir dosyanın kodlanması bilinmiyorsa veya ISO-8859-1 olarak belirtilmişse, bu cp1252'dir" ... nereden alıyorsunuz? Batı Avrupa, Amerika, ya geliyor ise hiç İngilizce/İspanyolca konuşan başka ülke/bölge ve geçerli UTF-8, o zaman olma olasılığı var CP1252

[Düzenle 2] Sizin hata değil/Fransızca byte 0x93, tüm kodlamalar için cp1250 ila cp1258 dahil olmak üzere U + 201C SOL DOUBLE QUOTATION MARK kodunun çözülmesini sağlar ... hangi metin yazılmış? [/ Edit 2]

(2) Dosyayı kaydedin (kaldırmayı kaldırmadan önce), ardından dosyayı tarayıcınızda açın: Mantıklı görünüyor mu? Görünüm/Karakter Kodlaması'nı tıkladığınızda ne görüyorsunuz?

(1) sizin giriş verileri dönüştürmek:

(3) biraz daha tavsiyesi ile chardet

Düzenleme deneyin: Eğer kodlama bildikten sonra

(CP1252 Şunu düşünelim var) Unicode'a: uc = raw_data.decode('cp1252')

(2) işlem unicode gibi veri (etc/keneler/eğik çizgi kaldırmak): clean_uc = manipulate(uc)

(3) utf8 olarak kodlanmış veri çıkışına gerekir: to_mongo = clean_uc.encode('utf8')

Not 1: Hata mesajı "pozisyonunda 1258 yılında byte 0x93 deşifre edemez" diyor ... 1258 bayt arasında oldukça uzun bir yığınıdır Metin; bu mantıklı mı? Şikayet ettiği verilere bir göz attınız mı? Nasıl? ne gördün?

Not 2: the Python Unicode HOWTO ve

+0

@Joshua Burns: Cevabı kabul ettiğiniz için teşekkürler, ancak gelecekteki okuyucular, sonucun ne olduğunu merak etmekten hoşlanacaklar ... cp1252, ya da başka bir şey? –

+0

@Joshua Burns: Üzgünüm, "gerçekten" anlamıyorum. Latin-1 olduğunu söylemedim. Cp125X olması muhtemel olduğunu söyledim. Latin-1, cp125X değil. Hata baytınız 0x93, Latin-1 olarak kodu çözüldüğünde gerçek zamanlı olarak görülmeyen bir gerçek dünya kontrolüdür. –

+0

Dosya özgün olarak İngilizce yazılmış ve harici bir kaynak tarafından sağlanmıştır. Hattın aşağısında bir yerlerde tahmin ediyorum, verilerin bir kısmı bozuldu ve asla düzeltilmedi. Metnin Latin-1 olarak kodlanması, gerçekçi olmayan bir karakterin temsil edildiği anlamına gelse de, bu senaryonun konusunu çözmüştür. –