2017-03-02 1 views
1

Ich bin neu bei Python. Ich lese Daten von SQL Server und schreibe dann die Daten in eine CSV-Datei. Die Tabellenzeile enthält Werte für Zahl, Zeichenfolge und Datum/Uhrzeit. Ich habe verschiedene Möglichkeiten ausprobiert, um die Daten zu schreiben. Zum BeispielUnicodeEncodeError: 'Charmap' Codec kann das Zeichen ' u5347' in Position 68 nicht codieren: Zeichen mappt auf <undefined>

#method 1 
import pandas as pd 

df = pd.DataFrame(table, columns=["colummn"]) 

df.to_csv('list.csv', index=False)* 

#method 2 
import csv 

fl = open('OnlineplayDatabase.csv', 'w') 

writer = csv.writer(fl) 

for row in table: 

    writer.writerow(row) 

fl.close()  

Beide Methoden funktionieren normalerweise. Aber wenn einige Zeilen chinesische Zeichen enthalten (siehe Beispiel unten), habe ich einen Kodierungsfehler erhalten. Die Fehlermeldung lautet:

codecs.charmap_encode(input,self.errors,encoding_table)[0] 

#Error Code 
UnicodeEncodeError: 'charmap' codec can't encode character '\u5347' in position 68: character maps to <undefined> 

Ich habe versucht, die Felder in der Zeile utf-8 zu codieren. Aber einige der Felder sind Zahlen.

Ihre Hilfe wird sehr geschätzt!

('120.239.9.116 ', 
'gyandroid ', 
4, 
9, 
'Dalvik/1.6.0(Linux;U;Android4.4.2;升级版Build/KVT49L)                  datetime.datetime(2016, 6, 11, 20, 54, 19), 
datetime.datetime(2016, 6, 11, 20, 56, 53), 
11521.0) 

Antwort

0

Schauen Sie sich den Fehler erneut an. Dies geschieht, weil irgendwo in Ihrem Datenrahmen Wörter stehen, die mit \u beginnen. Sie müssen das loswerden. Sehen Sie, ob das funktioniert. Verwenden Sie die remove_u-Funktion unten, um die \u loszuwerden.

def remove_u(word): 
    word_u = (word.encode('unicode-escape')).decode("utf-8", "strict") 
    if r'\u' in word_u: 
     # print(True) 
     return word_u.split('\\u')[1] 
    return word 

df.loc[:, 'colummn'] = df['colummn'].apply(func = remove_u) 

Sobald Sie den Datenrahmen aktualisiert haben, versuchen Sie es erneut zu schreiben.

EDIT

ich Ihre Spalte gehe davon aus einzelnen Wörtern zusammengesetzt. Wenn Ihre Spalte Zeichenfolgen enthält, verwenden Sie stattdessen die geänderte Version der remove_u

def remove_u(input_string): 
    words = input_string.split() 
    words_u = [(word.encode('unicode-escape')).decode("utf-8", "strict") for word in words] 
    words_u = [word_u.split('\\u')[1] if r'\u' in word_u else word_u for word_u in words_u] 
    # print(words_u) 
    return ' '.join(words_u) 
Verwandte Themen