2016-07-13 11 views
1

Ich konvertiere CSV-Dateien in Python Dataframe. Und in der Originaldatei hat eine der Spalten die Zeichen em-strich. Ich möchte es durch Bindestrich "-" ersetzen.konvertieren Em-Bindestrich in Bindestrich in Python

Teiloriginaldatei von csv:

NoDemande  NoUsager  Sens IdVehicule  NoConduteur  HeureDebutTrajet HeureArriveeSurSite HeureEffective' 
42192001801 42192002715 —  157Véh  42192000153 ... 
42192000003 42192002021 +  157Véh  42192000002 ... 
42192001833 42192000485 —  324My3FVéh  42192000157 ... 

Mein Code:

#coding=latin-1 
import pandas as pd 
import glob 

pd.set_option('expand_frame_repr', False) 

path = r'D:\Python27\mypfe\data_test' 
allFiles = glob.glob(path + "/*.csv") 
frame = pd.DataFrame() 
list_ = [] 
for file_ in allFiles: 
    df = pd.read_csv(file_,index_col=None,header=0,sep=';',parse_dates=['HeureDebutTrajet','HeureArriveeSurSite','HeureEffective'], 
         dayfirst=True) 
    df['Sens'].replace(u"\u2014","-",inplace=True,regex=True) 
    list_.append(df) 

Und es überhaupt nicht jedes Mal funktioniert, ist es sie nur in ? umwandeln, die, wie es aussieht:

42191001122 42191002244 ?   181Véh 42191000114 ... 
42191001293 42191001203 ?   319M9pVéh 42191000125 ... 
42191000700 42191000272 ?   183Véh 42191000072 ... 

Und weil ich französische Zeichen in der Datei habe, verwende ich latin-1 anstelle von utf-8. Wenn ich die erste Zeile löschen und schreiben wie folgt aus:

df = pd.read_csv(file_,index_col=None,header=0,sep=';',encoding='windows-1252',parse_dates=['HeureDebutTrajet','HeureArriveeSurSite','HeureEffective'], 
          dayfirst=True) 

Das Ergebnis wird sein:

42191001122 42191002244 â??   181Véh 42191000114 ... 
42191001293 42191001203 â??  319M9pVéh 42191000125 ... 
42191000700 42191000272 â??   183Véh 42191000072 ... 

Wie kann ich alle em-dash machen durch - ersetzt?

habe ich den Teil über repr:

for line in open(file_): 
    print repr(line) 

Und das Ergebnis stellt sich heraus:

'"42191002384";"42191000118";"\xe2\x80\x94";"";"42191000182";... 
'"42191002464";"42191001671";"+";"";"42191000182";... 
'"42191000045";"42191000176";"\xe2\x80\x94";"620M9pV\xc3\xa9h";"42191000003";... 
'"42191001305";"42191000823";"\xe2\x80\x94";"310V7pV\xc3\xa9h";"42191000126";... 
+0

Diese 'repr'-Ausgabe iteriert über die Zeichen des Dateinamens, nicht die Zeilen in der eigentlichen Datei, also ist es nicht sehr nützlich. Verwenden Sie stattdessen 'for line in open (file_)', um nützlichere Ergebnisse zu erhalten (Sie sollten einige Beispielzeilen aus der Ausgabe auswählen, um sie der Frage hinzuzufügen, anstatt alle einzubeziehen). – Blckknght

Antwort

2

u'\u2014' (EM DASH) nicht in latin1/iso-8859-1 codiert werden, so Dieser Wert kann nicht in einer ordnungsgemäß codierten Latin1-Datei angezeigt werden.

Möglicherweise sind die Dateien als Windows-1252 codiert, für die u'\u2014' kann als '\x97' codiert werden.

Ein weiteres Problem ist, dass die CSV-Datei scheinbar Leerzeichen als Spaltentrennzeichen verwendet, aber Ihr Code Semikolons verwendet. Sie können Leerzeichen als Trennzeichen delim_whitespace=True mit angeben:

df = pd.read_csv(file_, delim_whitespace=True) 

Sie können auch die Kodierung einer Datei mit dem encoding Parameter angeben. read_csv() werden die eingehenden Daten in Unicode umwandeln:

df = pd.read_csv(file_, encoding='windows-1252', delim_whitespace=True) 

In Python 2 (ich glaube, dass Sie das verwenden), wenn Sie in der ursprünglichen Codierung nicht die Codierung angeben, bleiben die Daten, und dies ist wahrscheinlich der Grund, dass Ihre Ersetzungen nicht funktionieren.

Sobald Sie richtig die Datei geladen haben, können Sie Zeichen ersetzen, wie Sie getan haben:

df = pd.read_csv(file_, encoding='windows-1252', delim_whitespace=True) 
df['Sens'].replace(u'\u2014', '-', inplace=True) 

EDIT

Ihr Update Nach dem Sie das repr() Ausgang zeigen, Ihre Die Datei scheint UTF8-codiert zu sein, nicht latin1 und nicht Windows-1252.Da Sie Python 2 verwenden müssen Sie die Codierung angeben, wenn die CSV-Datei laden:

df = pd.read_csv(file_, sep=';', encoding='utf8') 
df['Sens'].replace(u'\u2014', '-', inplace=True) 

Weil Sie eine Codierung angegeben, read_csv() die eingehenden Daten in Unicode konvertiert werden, so sollte replace() jetzt, wie oben gezeigt, arbeiten. Es sollte so einfach sein.

+0

@ ch36r5s: Bitte beachten Sie, dass ich Ihr Problem überdenken musste und dass es jetzt wahrscheinlich ist, dass Ihre CSV-Dateien als 'windows-1252' codiert sind. Ich habe die Antwort entsprechend aktualisiert. – mhawke

+0

Ich korrigierte, wie Sie sagten, und es stellte sich heraus: (nicht die gleiche Zeile) '42191000095 42191000448 â ?? 164Véh 42191000008 42191000592'. Die csv-Datei, die ich gezeigt habe, ist die von python gepostete, die ursprüngliche ist wie "42192001833"; "42192000485"; "-"; "324My3FVéh"; "42192000157" ", also habe ich die' sep = '; " wie es war. – ch36r5s

+0

Dies sieht immer noch wie ein Codierungsproblem aus. Welche Kodierung hast du für 'read_csv()' angegeben? Können Sie die ausgewählte Ausgabe hier posten: 'for line in open ('Datei.csv'): print repr (line)'. Zeigen Sie einige Beispiele für die Zeilen an, die nicht korrekt sind. Dies sollte helfen, die Codierung zu identifizieren. – mhawke