2013-09-25 17 views
8

Przetwarzam dużą liczbę plików CSV w pythonie. Pliki są odbierane od organizacji zewnętrznych i są kodowane za pomocą szeregu kodowań. Chciałbym znaleźć zautomatyzowany sposób, aby usunąć następujące elementy:Usuwanie niedrukowalnych znaków "gremlin" z plików tekstowych

  • znaków spoza ASCII
  • znaki sterujące
  • Null (ASCII 0) znaków

Mam produkt o nazwie „Znajdź i zamień go! " używałoby to wyrażeń regularnych, więc bardzo pomocny byłby sposób rozwiązania powyższego z wyrażeniem regularnym.

Dziękuję

+0

'Pliki są odbierane od organizacji zewnętrznych i są kodowane za pomocą szeregu kodowań" - a te są ... Nie należy ich pytać? Jaki jest twój powiązany z tym produkt? Czego próbujesz użyć danych dla ... Czy naprawdę potrzebujesz Pythona? –

+0

Dobre pytania. Pliki CSV. Kodowanie obejmuje "nieznany" (zgodnie z Find and Replace It!), "Utf-8", "iso-88591-1" i inne. Nie można ich poprosić - zbyt wiele e-maili, zbyt długo. Napisałem już pythona, który zmienia format plików CSV. A skrypt działa w większości przypadków, z wyjątkiem sytuacji, gdy gremliny (które w jakiś sposób równoważą \ r) zepsuć CSV.reader. Usunięcie nie-ascici, jednak zakodowanej, rozwiązałoby mnie. Twoje zdrowie! –

+0

Dziękuję za wszystkie te komentarze. W pośpiechu, aby wykonać pracę, użyłem czegoś o nazwie BBEdit, które usunie "gremliny", takie jak/r znaki zakodowane za pomocą kodowania, którego Python nie rozpoznaje (bez dalszej pracy). Teraz, gdy wiem, jak zidentyfikować te gremliny za pomocą BBEdit, sprawdzę, czy którekolwiek z poniższych rozwiązań robi to samo i zaznacz pierwszą odpowiedź. –

Odpowiedz

5

Alternatywą może być zainteresowany będzie:

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

To po prostu filtruje wszystkie znaki niedrukowalne z brudnym sznurkiem to otrzymuje.

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

Spróbuj tego:

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

Chodzi o to, aby dopasować każdą lub znak nul „wysoki ASCII” (tzn \ 0 i te, które nie mieszczą się w 7 bitów) i usunąć je . Możesz dodać kolejne znaki, takie jak ASCII ESC lub BEL.

Albo to:

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

Pomysł jest tylko pozwalają na ograniczony zakres „druku ASCII”, ale należy pamiętać, że ten usuwa także nowe linie. Jeśli chcesz zachować nowe linie lub tabulatory lub tym podobne, po prostu dodaj je do nawiasów.

+0

dzięki. Spróbuję i wrócę dzisiaj. Nie potrzebuję zachować zakładek, ale potrzebuję nowych linii (i miejmy nadzieję, poprawnych CR w obudowach CSV), które będą zachowane, jednak zakodowane. –

2

Wymień coś, co nie jest pożądaną postać z pustym (usunąć):

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

Dzięki temu wszystkie białe znaki (spacje, znaki nowej linii, zakładki itp), a wszystkie "normalne" znaków (! to pierwszy plik do wydrukowania w formacie ASCII, a ~ to ostatni plik ASCII do wydrukowania pod przecinkiem 128).

Powiązane problemy