developer tip

Python : csv.DictReader에서 #으로 표시된 주석 줄을 건너 뜁니다.

optionbox 2020. 12. 5. 09:39
반응형

Python : csv.DictReader에서 #으로 표시된 주석 줄을 건너 뜁니다.


csv.DictReader를 사용 하여 CSV 파일을 처리하는 것은 훌륭하지만 주석 줄이있는 CSV 파일 (줄 시작 부분에 해시로 표시됨)이 있습니다. 예를 들면 다음과 같습니다.

# 단계 크기 = 1.61853
val0, val1, val2, 혼성화, 온도, smattr
0.206895,0.797923,0.202077,0.631199,0.368801,0.311052,0.688948,0.597237,0.402763
-169.32,1,1.61853,2.04069e-92,1,0.000906546,0.999093,0.241356,0.758644,0.202382
# 적응 완료

csv 모듈 에는 이러한 줄을 건너 뛸 수있는 방법이 없습니다 .

나는 쉽게 해키를 할 수 있지만 csv.DicReader를 다른 반복기 객체 주위에 감싸는 좋은 방법이 있다고 생각합니다.


실제로 이것은 다음과 잘 작동합니다 filter.

import csv
fp = open('samples.csv')
rdr = csv.DictReader(filter(lambda row: row[0]!='#', fp))
for row in rdr:
    print(row)
fp.close()

좋은 질문이며, Python의 CSV 라이브러리에 기본 주석 처리와 같은 중요한 기능이 부족한 방법에 대한 좋은 예입니다 (CSV 파일 상단에서 드물지 않음). Dan Stowell의 솔루션은 OP의 특정 경우에 적용 #되지만 첫 번째 기호로 표시되어야 한다는 점에서 제한적입니다 . 보다 일반적인 솔루션은 다음과 같습니다.

def decomment(csvfile):
    for row in csvfile:
        raw = row.split('#')[0].strip()
        if raw: yield raw

with open('dummy.csv') as csvfile:
    reader = csv.reader(decomment(csvfile))
    for row in reader:
        print(row)

예를 들어, 다음 dummy.csv파일 :

# comment
 # comment
a,b,c # comment
1,2,3
10,20,30
# comment

보고

['a', 'b', 'c']
['1', '2', '3']
['10', '20', '30']

물론 이것은 csv.DictReader().


CSV 파일을 읽는 또 다른 방법은 pandas

다음은 샘플 코드입니다.

df = pd.read_csv('test.csv',
                 sep=',',     # field separator
                 comment='#', # comment
                 index_col=0, # number or label of index column
                 skipinitialspace=True,
                 skip_blank_lines=True,
                 error_bad_lines=False,
                 warn_bad_lines=True
                 ).sort_index()
print(df)
df.fillna('no value', inplace=True) # replace NaN with 'no value'
print(df)

이 csv 파일의 경우 :

a,b,c,d,e
1,,16,,55#,,65##77
8,77,77,,16#86,18#
#This is a comment
13,19,25,28,82

다음과 같은 결과를 얻을 수 있습니다.

       b   c     d   e
a                     
1    NaN  16   NaN  55
8   77.0  77   NaN  16
13  19.0  25  28.0  82
           b   c         d   e
a                             
1   no value  16  no value  55
8         77  77  no value  16
13        19  25        28  82

참고 URL : https://stackoverflow.com/questions/14158868/python-skip-comment-lines-marked-with-in-csv-dictreader

반응형