2013-09-25 19 views
8

Çok sayıda CSV dosyasını python'da işliyorum. Dosyalar harici organizasyonlardan alınır ve bir dizi kodlamayla kodlanır. Aşağıdaki kaldırmak için otomatik bir yöntem bulmak istiyoruz:Yazdırılamayan "gremlin" karakterlerini metin dosyalarından çıkarma

  • ASCII olmayan Karakterler
  • Kontrol karakterleri
  • Boş (ASCII 0) Karakterler

ben diye bir ürün var 'Bul ve değiştirin! ' Normal ifadeleri kullanacak şekilde, yukarıdaki ifadeleri düzenli bir ifadeyle çözmenin çok yararı olacaktır.

Eğer

+0

'Dosyalar dış kuruluşlardan alınmış ve bir dizi kodlamayla kodlanmıştır - ve bunlar ... Onları istemeyin mi? İlgili ürününüzün bununla ne ilgisi var? Verileri ne için kullanmaya çalışıyorsunuz ... Python'a gerçekten ihtiyacınız var mı? –

+0

İyi sorular. CSV dosyaları. Kodlamalar 'bilinmeyen' (Bul ve Değiştir'e Göre!), 'Utf-8', 'iso-88591-1' ve diğerleri içerir. Onlara sorma - çok fazla e-posta, çok uzun. CSV dosyalarını yeniden biçimlendiren python'u zaten yazdım. Ve komut dosyası, gremlinlerin (bir şekilde eşdeğerde olduğu gibi) CSV.reader'ı dağıtmadığı durumlar hariç, çoğu durumda çalışır. Ancak, asciis olmayanı çıkarmak kodlanmış olsa beni çıkarırdı. Şerefe! –

+0

Tüm bu yorumlar için teşekkürler. Yapılan işi elde etmek için aceleyle, BBEdit denen bir şey kullandım. Bu, pythonun tanımayacağı bir kodlamayla kodlanmış/r karakterleri gibi 'gremlinleri' kaldıracaktır (daha fazla çalışma olmadan). Şimdi bu gremlinleri BBEdit kullanarak nasıl tanımlayacağımı biliyorum, aşağıdaki çözümlerden herhangi birinin aynı şeyi yapıp yapmadığını kontrol edip ilk cevabı işaretlemem gerek. –

cevap

5

alternatif olacaktır:

import string 
clean = lambda dirty: ''.join(filter(string.printable.__contains__, dirty)) 

Bu sadece aldığı kirli dize olmayan tüm yazdırılabilir karakterleri filtreler.

>>> len(clean(map(chr, range(0x110000)))) 
100 
5

bu deneyin ederiz:

clean = re.sub('[\0\200-\377]', '', dirty) 

fikri (yani \ 0 ve 7 bit sığmayan olanlar) her NUL veya "yüksek ASCII" karakter maç ve bunları kaldırmaktır . ASCII ESC veya BEL gibi daha fazla karakter ekleyebilirsiniz.

Ya da bu:

clean = re.sub('[^\040-\176]', '', dirty) 

fikir "yazdırılabilir ASCII" sadece sınırlı aralığını izin vermek olmak ancak bu da yeni satır kaldırır unutmayın. Yeni satırları veya sekmeleri veya benzerlerini tutmak istiyorsanız, bunları yalnızca parantez içine ekleyin. Eğer ilginizi çekebilir

+0

teşekkürler. Bugün tekrar deneyeceğim. Tutulmak için sekmelere ihtiyacım yok, ancak şifrelenecek şekilde yeni satırlara (ve csv muhafazaları içinde umarız geçerli CR'lere) ihtiyacım var. –

2

boş bir arzu karakteri (silin) ​​değil bir şey değiştir: Bu tüm boşlukları (boşluk, yeni satırlar, sekmeler vb) verir

clean = re.sub('[^\s!-~]', '', dirty) 

ve tüm "normal" karakter (! ilk asi yazdırılabilir ve ~ ondalık altında yazdırılabilir son asçi 128).