2016-07-13 8 views
1

저는 csv 파일을 파이썬 데이터 프레임으로 변환하고 있습니다. 그리고 원본 파일에서 열 중 하나에 em-dash라는 문자가 있습니다. 하이픈 "-"으로 바꿔주세요. CSV에서파이썬에서 em-dash를 하이픈으로 변환합니다.

부분 원본 파일 :

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

내 코드 :

#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) 

그리고 그것은, 전혀처럼 보이는 그것은 단지 ?로 변환 할 때마다 작동하지 않습니다 :

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

파일에 프랑스어 문자가 있기 때문에을 사용하고 있습니다. utf-8 대신내가 첫 번째 라인을 삭제하고 다음과 같이 작성하는 경우 :

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

결과는 다음과 같습니다

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

가 어떻게 -로 대체 모든 전각 대시 을 만들 수 있습니까? 그래서

'"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

'repr' 출력은 실제 파일의 행이 아닌 파일 이름의 문자를 반복하므로 매우 유용하지는 않습니다. 더 유용한 결과를 얻기 위해서는'for line in open (file_)'을 사용하십시오. 출력물에서 몇 가지 예제 라인을 선택하여 질문을 추가하는 대신 모든 질문에 추가하십시오. – Blckknght

답변

2

u'\u2014' (EM 대시)를 라틴/ISO-8859-1에서 인코딩 될 수

repr 대해 일부 추가 :

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

그 결과가 나온다 그 값은 올바르게 인코딩 된 latin1 파일에 나타날 수 없습니다.

아마도 파일은 u'\u2014''\x97'으로 인코딩 될 수있는 windows-1252로 인코딩됩니다.

또 다른 문제점은 CSV 파일이 분명히 열 구분 기호로 공백을 사용하지만 코드에서 세미콜론을 사용한다는 것입니다. 당신은 delim_whitespace=True를 사용하여 구분 기호로 공백을 지정할 수 있습니다

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

또한 encoding 매개 변수를 사용하여 파일의 인코딩을 지정할 수 있습니다. read_csv() 유니 코드로 들어오는 데이터를 변환합니다 : 당신은 인코딩을 지정하지 않으면 파이썬 2 (난 당신이 것을 사용하고 있는지 생각)에서

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

는, 데이터는 원래의 인코딩에 남아, 이것은 아마도

대체물이 효과가없는 이유. 제대로 파일을로드 한 후에는하고있다으로

, 당신은 문자를 대체 할 수

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

편집

당신이 repr() 출력을 보여줍니다 당신의 갱신에 따라, 당신의 파일은 latin1이 아닌 UTF8로 인코딩되고 Windows-1252는 아닌 것처럼 보입니다.파이썬 2를 사용하고 있기 때문에 당신은 CSV 파일을로드 할 때 인코딩을 지정해야합니다 : 당신은 인코딩을 지정하기 때문에

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

read_csv()은 유니 코드로 들어오는 데이터를 변환합니다 위와 같이 너무 replace() 지금 작동합니다. 그렇게 쉬워야합니다.

+0

@ ch36r5s : 문제에 대해 다시 생각해 보았으므로 CSV 파일이 'windows-1252'로 인코딩 된 것 같습니다. 그에 따라 답변을 업데이트했습니다. – mhawke

+0

나는 당신이 말한대로 교정했고, 그것은 밝혀졌다 : (같은 줄은 아니다)'42191000095 42191000448 â ?? 164Vh © h 42191000008 42191000592'. 필자가 보여준 csv 파일은 파이썬에 의해 게시 된 파일이며 원래의 파일은''42192001833 ";"42192000485 ";"- ";"324My3FVéh ";"42192000157 "'이므로'sep = ';'' 그랬던 것처럼. – ch36r5s

+0

이것은 여전히 ​​인코딩 문제로 보입니다. 'read_csv()'에 어떤 인코딩을 지정 했습니까? 다음과 같이 선택된 출력을 게시 할 수 있습니까 :'open in line ('file.csv') : print repr (line)'. 올바르지 않은 행의 예를 보여줍니다. 인코딩을 식별하는 데 도움이됩니다. – mhawke