2013-09-25 18 views
8

Sto elaborando un gran numero di file CSV in python. I file vengono ricevuti da organizzazioni esterne e sono codificati con una gamma di codifiche. Mi piacerebbe trovare un metodo automatico per rimuovere il seguente:Rimozione di caratteri "gremlin" non stampabili da file di testo

  • caratteri non-ASCII
  • caratteri di controllo
  • Null (ASCII 0) Personaggi

Ho un prodotto chiamato 'find e sostituiscilo! ' quello userebbe le espressioni regolari quindi un modo di risolvere il suddetto con un'espressione regolare sarebbe molto utile.

Grazie

+0

'I file vengono ricevuti da organizzazioni esterne e sono codificati con un intervallo di codifiche' - e quelli sono ... Chiedere loro di non farlo? Cosa c'entra il tuo prodotto correlato con questo? Cosa stai cercando di usare i dati per ... Hai davvero bisogno di Python? –

+0

Buone domande. File CSV. Le codifiche includono "sconosciuto" (secondo Trova e sostituisci!), "Utf-8", "iso-88591-1" e altri. Non posso chiedere a loro - troppe email, troppo a lungo. Ho già scritto il python che riformatta i file CSV. E la sceneggiatura funziona nella maggior parte dei casi eccetto dove gremlins (che in qualche modo fa l'equivalente di \ r) rovina CSV.reader. Rimuovere i non-asciis comunque codificati mi avrebbe risolto. Saluti! –

+0

Grazie per tutti questi commenti. Nella fretta di finire il lavoro ho usato qualcosa chiamato BBEdit che rimuoverà 'gremlins' come caratteri/r codificati con una codifica che python non riconosce (senza ulteriore lavoro). Ora che so come identificare questi gremlins usando BBEdit, controllerò se una delle soluzioni seguenti fa la stessa cosa e spunta la prima risposta che fa. –

risposta

5

Un'alternativa potrebbe essere interessato sarebbe:

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

Si filtra semplicemente fuori tutti i caratteri non stampabili dalla stringa sporco che riceve.

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

provare questo:

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

L'idea è quella di abbinare ogni o il carattere "high ASCII" NUL (cioè \ 0 e quelli che non rientrano in 7 bit) e rimuoverli . Puoi aggiungere più caratteri man mano che li trovi, come ASCII ESC o BEL.

O questo:

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

L'idea è di permettere solo la gamma limitata di "ASCII stampabili", ma si noti che questo elimina anche a capo. Se si desidera mantenere le nuove righe o schede o simili, è sufficiente aggiungerli tra parentesi.

+0

grazie. Proverò e tornerò oggi. Non ho bisogno di schede da conservare, ma ho bisogno di nuove righe (e, si spera, valide CR all'interno degli allegati csv) da conservare, comunque codificate. –

2

Sostituire tutto ciò che non è un personaggio desiderabile con uno spazio (eliminarlo):

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

In questo modo tutti gli spazi (spazi, a capo, tabulazioni, ecc), e tutti i personaggi "normali" (! è il primo stampabile ascii e ~ è l'ultimo stampabile ascii in decimale 128).

Problemi correlati