2016-08-30 2 views
0

나는 pandas를 사용하여 excel에서 만든 csv 파일을로드하고 분석 한 다음 csv 파일에 결과를 저장합니다. 나는 팬더 to_csv와 from_csv 메소드가 \ r과 같은 특수 문자를 처리 할 수있는 것처럼 보이지 않지만 오류도 발생시키지 않는다는 것을 알았습니다. 내가 여기에 어떤 인코딩을 지정하고 있지 않다 때문에CSV 파일을 쓰거나 읽을 때 특수 문자 ( r) 문제

In [7]: import pandas as pd 

In [8]: data = {    
'A': ['one', 'two', 'three'], 
'B': ['four', 'five', 'six'] 
} 

In [9]: df = pd.DataFrame(data) 

In [10]: df 
Out[10]: 
     A  B 
0 one four 
1 two five 
2 three six 

In [11]: df.loc[1,'A'] = 't' + '\r' + 'o' 

In [12]: df 
Out[12]: 
     A  B 
0 one four 
1 t\ro five 
2 three six 

In [13]: df.to_csv("my_df.csv") 

In [14]: df2 = pd.DataFrame.from_csv("my_df.csv") 

In [15]: df2 
Out[15]: 
     A  B 
0 one four 
1  t NaN 
o five NaN 
2 three six 

나는 ASCII를 사용하지만 인코딩을 지정하는 경우도 = 'UTF-8'쓰기와 읽기가 나는 같은 결과를 얻을 가정입니다.

행/열이 손상되지 않거나 예기치 않은 일이 발생하도록 강력한 csv 쓰기 및 읽기 스크립트를 작성하려면 어떻게해야합니까? 유일한 해결책은 csv에 쓰기 전에 모든 문자열을 확인하고 '정리'하는 것입니다. 그런 다음 가장 쉬운 방법은 무엇입니까?

+0

CSV가 다소 야생 형식입니다 : 당신이 다른 것을 찾고 있다면, 당신은 read_csvlineterminator 인수를 시도 할 수 있습니다 많은 방언으로 RFC 4180은이를 정의하려고 시도합니다. 그곳에. 캐리지 리턴 ('\ r')은 TEXTDATA 블록 내부에서 허용되지 않습니다. 그것은 라인 (레코드) delimeter의 일부입니다. –

답변

1

누군가가 더 좋은 제안을하지 않는 한, 팬더를로드하기 전에 모든 CSV 파일을 사전 처리하여 다음과 같이 특정 문제를 처리합니다. 그것은 현재의 시스템에서 작동하는 것으로 보이지만 어리석은 증거라고 확신하지는 않습니다.

In [30]: f = open("my_df.csv") 

In [31]: content = f.read().replace('\r',' ') 

In [32]: with open("my_df2.csv", "w") as g: 
    ....:  g.write(content) 
    ....:  

In [33]: df2 = pd.DataFrame.from_csv("my_df2.csv") 

In [34]: df2 
Out[34]: 
     A  B 
0 one four 
1 t o five 
2 three six 
+0

사전 처리 후 파일에 다시 쓸 필요가 없습니다. 'StringIO (content)'를 파일 핸들로 사용하십시오. 예 :'df2 = pd.read_csv (StringIO (content), ...)'. – ptrj

+0

또한 : python3은 자동으로 '\ r'을 '\ n'으로 바꿉니다. 그래서, 당신의'f.read(). replace ('\ r', '')'는 작동하지 않을 것입니다. 이 경우 바이너리 모드로 읽은 다음 바이트를 문자열로 변환/디코딩 할 수 있습니다. – ptrj

0

전처리가 최선의 선택일 수 있습니다. (리눅스에 나를 위해 작동하지만 다른 플랫폼에 대한 보장 할 수 없습니다.)

df = pd.read_csv("my_df.csv", index_col=0, lineterminator='\n')