2016-10-25 41 views
8

Otrzymałem plik csv wyeksportowany z bazy danych MySQL (myślę, że kodowanie jest latin1, ponieważ język jest hiszpański). Niestety kodowanie jest nieprawidłowe i nie mogę go w ogóle przetworzyć. Jeśli używam plik:Python MySQL Eksport CSV do json dziwne kodowanie

$ file -I file.csv file.csv: text/plain; charset=unknown-8bit

Próbowałem odczytać pliku w python i przekonwertować go na UTF-8 jak:

r.decode('latin-1').encode("utf-8")

lub używając mysql_latin1_codec:

r.decode('mysql_latin1').encode('UTF-8')

Próbuję g przekształcić dane w obiekty json. Błąd pojawia się, gdy mogę zapisać plik:

„UnicodeEncodeError:«ascii»codec nie można zakodować znaków w pozycji”

Czy wiesz, w jaki sposób mogę przekonwertować go do normalnych znaków UTF-8? Albo jak mogę przekonwertować dane na prawidłowy json? Dzięki!!

+1

czy możesz podać przykład tego, co próbujesz rozszyfrować, ponieważ tylko błąd nie jest łatwy do odtworzenia problemu i znalezienia możliwego rozwiązania ... – coder

+0

w polach csv pola wyglądają następująco: np. DIRECCI N BARCELONA, v lida hasta, itp. – alexsc

Odpowiedz

1

Mam naprawdę dobre wyniki, używając pandasowej ramki danych z Continuum Analytics.

coud zrobić coś takiego:

import pandas as pd 
from pandas import * 

con='Your database connection credentials user, password, host, database to use' 
data=pd.read_sql_query('SELECT * FROM YOUR TABLE',conn=con) 

to można zrobić:

data.to_csv('path_with_file_name') 

lub przekonwertować do formatu JSON:

data.to_json(orient='records') 

lub jeśli wolisz, aby dostosować json format zobacz dokumentację tutaj: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_json.html

+0

hi Beatriz, rzeczywiście użyłem pand, aby otworzyć CSV i wdrożyć je do json za pomocą force_ascii = True i zadziałało – alexsc

0

Czy próbowali za pomocą modułu kodeki ?:

import codecs 
.... 
codecs.EncodedFile(r, 'latin1').reader.read() 

Pamiętam mające podobny problem jakiś czas temu, a odpowiedź była coś zrobić z jak kodowanie zostało wykonane przed Python 3. Kodeki wydaje się obsługiwać ten problem stosunkowo elegancko.

Jako programista wspomniany w komentarzu do pytania, trudno jest wskazać problem, nie mogąc go odtworzyć, więc mogę szczekać złe drzewo.

+0

I ried, że i inne rzeczy również, bez powodzenia :(. Dziękujemy! – alexsc

0

Prawdopodobnie masz dwa problemy. Ale cofnijmy się ... Nie wiemy, czy tekst został nieprawidłowo zaimportowany, nieprawidłowo wyeksportowany, czy po prostu wyświetlany w głupkowaty sposób.

Po pierwsze, mam zamiar omówić „importowania” ...

Nie próbuj zmieniać kodowanie. Zamiast tego żyj z kodowaniem. Ale najpierw sprawdź, jakie jest kodowanie. Może to być latin1 lub może być ut8. (Lub dowolne z wielu mniej prawdopodobnych zestawów znaków).

Dowiedz się, jaki jest heks dla przychodzącego pliku. W Pythonie, kod jest coś takiego na hex (ETC) dumpingu ciąg u:

for i, c in enumerate(u): 
    print i, '%04x' % ord(c), unicodedata.category(c), 
    print unicodedata.name(c) 

Możesz iść here zobaczyć listę wartości hex dla wszystkich latin1 znaków wraz z hex utf8. Na przykład: ó to latin1 F3 lub utf8 C2B3.

Teraz uzbrojony w znajomość kodowania, powiedz MySQL, że.

LOAD DATA INFILE ... 
    ... 
    CHARACTER SET utf8 -- or latin1 
    ...; 

Tymczasem, to nie ma znaczenia co CHARACTER SET ... tabelę lub kolumna określa się; mysql transkoduje w razie potrzeby. Wszystkie znaki hiszpańskie są dostępne w latin1 i utf8.

Przejdź do this Q&A.

Zasugerowałem, że masz dwa błędy, jeden to wspomniany tam przypadek "czarnego diamentu"; tam jest coś innego. Ale ... Postępuj zgodnie z "Najlepszą praktyką" wspomniano.

Powrót do was pytanie o „eksporcie” ...

Znowu trzeba sprawdzić hex pliku wyjściowego. Znowu nie ma znaczenia, czy jest to latin1 czy utf8. Jednak ... Jeśli hex jest C383C2B3 dla po prostu ó, masz "podwójne kodowanie". Jeśli tak, sprawdź, czy usunąłeś wszystkie ręczne wywołania funkcji konwersji i po prostu powiedział MySQL co jest.

Oto niektóre dodatkowe informacje, które mogą być potrzebne.

Jeśli potrzebujesz dodatkowej pomocy, postępuj zgodnie z tekstem krok po kroku. Pokaż nam kod służący do przenoszenia/konwertowania go na każdym kroku i pokaż nam HEX na każdym kroku.

+0

Witam Rick i dziękuję za wspaniałe wyjaśnienie. Jestem świadomy twoich wskazówek, ale, niestety, nie mam dostępu do MySQL, jestem ograniczony do niektórych plików CSV, które zostały już wyeksportowane błędnie :(. – alexsc

+0

Czy możesz użyć Pythona do odkrycia heksadeci w plikach? Może przeczytać jako "binarny", a następnie spojrzeć na hex? (nie mówię w języku Python, więc nie mogę pomóc w konkretnym kodzie). A może narzędzie do zrzutu heksadecymalnego? –

+0

Masz na myśli coś takiego: \ x89 \ xe3 \ xa2? – alexsc