2017-10-31 11 views
5

podczas zapisywania danychobchodzić zastępcze z pand

data.to_csv(outp_file, encoding='utf-8') 

czasami pojawiają się błędy jak ten

UnicodeEncodeError: 'utf-8' codec can't encode characters in position 233-234: surrogates not allowed

W python3 można po prostu wymienić takie postacie

>> "abc\udc34xyz".encode('utf-8', 'replace').decode('utf-8') 
'abc?xyz' 

Ale tutaj mam ramka danych z N wierszami i M kolumnami. Dla mnie jest w porządku usuwanie wierszy z surogatami, ale nie jest dobrze, aby pominąć całą ramkę danych.

Problem polega na tym, że nie wiem, w których wierszach i w jakich kolumnach są.

szukam rozwiązania, które można zastosować w następujący sposób

try: 
    data.to_csv(outp_file, encoding='utf-8') 
except UnicodeEncodeError: 
    # process data and save it without surrogates... 

pomocy?

+0

Nie możesz po prostu użyć 'applymap' do zastosowania funkcji Pythona do wszystkich komórek indywidualnie przed napisaniem pliku CSV? – JohnE

+0

i jak zawsze lepiej jest podać małą próbkę obrazu, aby ludzie mogli przetestować swoje odpowiedzi. a także pożądane wyniki. – JohnE

+0

@JohnE Na razie wydaje się, że jest to jedyne możliwe rozwiązanie, bez względu na to, że mówi "to nie jest sposób w jaki powinieneś to zrobić". Często mam do czynienia z dość dużymi ramkami danych mającymi kilka milionów kolumn tekstu (a rozwiązanie "po prostu sprawdź każdą jego część" może nie bardzo dobrze skalować). Dane wejściowe to dowolna ramka danych (może być dość duża, jak wskazałem) z komórkami zawierającymi znaki zastępcze, takie jak w moim pytaniu. Pożądanym wynikiem jest zastąpienie ramki danych zastępującymi znakami znakiem "?" jak w moim pytaniu. – tarashypka

Odpowiedz

0

Nie jest jasne, jak wyglądają wejścia Unicode, ani dlaczego czasami mają punkty kodowe inne niż UTF16, które wymagają niskiej wartości zastępczej, takiej jak DC34. Jeśli dane w większości mieści się w USASCII, następnie iconv może zaoferować użyteczny sposób rozebrać się niewygodnych codepoints:

$ cat foo1.csv | iconv -c -f utf16 -t latin1 | iconv -f latin1 -t utf8 > foo2.csv 

Czy aplikacja odczytać wynikowy .csv wyjściowego.

Jeśli spojrzysz na numer iconv --help, zauważysz, że -c oznacza odrzucenie, a ponadto jest kilka innych potencjalnie pomocnych opcji odrzucania.