2009-11-06 22 views
5

Bir PML (Palm Markup Language) dosyasını düzeltmeye çalışırken, test dosyamda ASCII olmayan karakterler varmış gibi görünüyor ve bu da MakeBook'un şikayetçi olmasına neden oluyor. Çözüm, PML'deki ASCII olmayan tüm karakterleri çıkartacaktı.Genişletilmiş ascii python kullanarak nasıl kaldırılır?

Yani python Bunu düzeltmek için çalışırken, ben Ancak

import unicodedata, fileinput 

for line in fileinput.input(): 
    print unicodedata.normalize('NFKD', line).encode('ascii','ignore') 

var, bu hat "unicode, str değil" olması gerektiğini hatayla sonuçlanır. İşte bir dosya parçası.

\B1a\B \tintense, disordered and often destructive rage†.†.†.\t 

Bu noktada işlenecek satırın düzgün şekilde nasıl iletileceğinden tam olarak emin değilsiniz.

+0

Eğer ASCII değeri 255 daha büyük olan herhangi bir karakter filtre istiyor musunuz? –

+0

Kesin olarak, Genişletilmiş ASCII diye bir şey yoktur. ASCII değerleri 0'dan 127'ye kadar tanımlar. Bundan daha yüksek olan herhangi bir şey sadece keyfi olarak yorumlanabilir. Belki de * ASCII olmayan karakterler * terimini kullanmalısınız. – dreamlax

+0

İlgili: Terminal çıkışı için güvenli çıkış fonksiyonu http://stackoverflow.com/questions/437476/safe-escape-function-for-terminal-output – jfs

cevap

0

Python'daki bir dosyadan okurken, Python 2.x ve önceki sürümlerde "str" ​​aka bayt dizeleri alırsınız. Bunları, decode yöntemini kullanarak "unicode" türüne dönüştürmeniz gerekir. örneğin: 'latin1' doğru kodlamayla değiştirin.

5

print line.decode('iso-8859-1').encode('ascii', 'ignore')'u deneyin - İstediğinize çok daha yakın olmalıdır. aslında olmadığını

line.decode('ascii')

Bu veriler için hataları yükseltecektir: cevap ascii codec kullanarak metne bunu deşifre etmek yani

+0

MakeBook artık yasadışı kontrol kodlarından şikayet etse de bu işe yarıyor. –

+0

@Jauder, tabiki kontrol kodlarını da kaldırabilirsiniz, örneğin yukarıdaki 'clean =' 'sonra.katılmak (c satırında c için c (c)> = 32 ise ise) (yeni satır ve satır başı geri dönüşü dahil olmak üzere TÜM kontrol kodlarını kaldırır) - tadı ayarlamak, istediğiniz kontrol kodlarını bilmeden sizin için gerçekten yapamayız Kaldır!-). –

+0

@Alex, eğer biliyor olsaydım, ben =). Sorun şu ki, sadece bir şifreli hata mesajı veren kaynaksız bir Java prog ile çalışıyorum. http://gist.github.com/227882 –

5

Sen, ASCII kodlu veri olarak line değerlendirmesini istediğiniz ASCII kodlu. Bu hataları yok saymak için:

line.decode('ascii', 'ignore').

Bu, size unicode örneği biçimindeki metni verir.

line.decode('ascii', 'ignore').encode('ascii')

2

bırakmak için: Bunun yerine metin yerine (ascii-kodlanmış) verilerle çalışmak istiyorsanız, bunu bir str veya bytes örneğini geri almak için yeniden kodlamaları olabilir (Python sürümüne bağlı olarak) ASCII olmayan karakterler line.decode(your_file_encoding).encode('ascii', 'ignore') kullanır. Ama muhtemelen daha iyi onlar için PLM çıkış sıralarını kullanmak:

import re 

def escape_unicode(m): 
    return '\\U%04x' % ord(m.group()) 

non_ascii = re.compile(u'[\x80-\uFFFF]', re.U) 

line = u'\\B1a\\B \\tintense, disordered and often destructive rage\u2020.\u2020.\u2020.\\t' 
print non_ascii.sub(escape_unicode, line) 

Bu \B1a\B \tintense, disordered and often destructive rage\U2020.\U2020.\U2020.\t çıkarır. düzenli ifade ile

Damlama ASCII olmayan ve kontrol karakterleri (bu güvenle kaçan sonra kullanılabilir) çok kolaydır:

regexp = re.compile('[^\x09\x0A\x0D\x20-\x7F]') 
regexp.sub('', line) 
İlgili konular