2019년 11월 17일 일요일

python 에서 csv 파일 읽기

" (quote)를 포함하는 csv 파일 읽기


언어 : Python3

CSV 모듈은 아래에서 참고 하면 됩니다.
https://docs.python.org/ko/3/library/csv.html

기본 예제

기본 예제는 아래와 같습니다.

import csv
with open('1.csv', encoding='utf-8') as csvfile:
 reader = csv.reader(csvfile, delimiter=',', quotechar='"')
 for row in reader:
  print(row)

이때 delimiter=',' 이 부분은 구분자를 의미합니다. quotechar='"' 이건 둘러쌓이는 문자를 의미합니다. 일반적으로 엑셀에서 csv변환을 할때도 많이 붙어 있습니다.

그래서 아래와 같은 예제 파일을 준비하였습니다. 아래를 읽으면 어떻게 될까요?

"한글","테스트","CSV"
"한글",123,4567
""이건뭔가"",""이런경우","제대로 될까""
"'이건","띠리리'","'띠리리"
" " T " "," " " T " " "," " " " T " " " "

결과는 아래와 같습니다.

['한글', '테스트', 'CSV']
['한글', '123', '4567']
['이건뭔가""', '이런경우"', '제대로 될까"\n\'이건"', "띠리리'", "'띠리리"]
['  T " "', '  " T " " "', '  " " T " " " "']
일반적인 경우문제가 없습니다.
문제가 되는 경우는 " 가  중복되었는 경우 입니다. 원본 ""이건뭔가"" => 읽은 결과는 이건뭔가"" 이렇게 되어 있습니다. 여기에서 ' 표시는 list안에 들어 있기 때문에 출력되는 것이라 무시 하시면 됩니다.

뭔가 해보기

이걸 처리하려고 CSV 도움말을 살펴보았습니다. doublequote=False 이값을 건들어 보았습니다. 기본값은 True라고 해서 false로 변경해보았습니다.

with open('1.csv', encoding='utf-8') as csvfile:
 reader = csv.reader(csvfile, delimiter=',', quotechar='"',doublequote=False)
 for row in reader:
  print(row)

['한글', '테스트', 'CSV']
['한글', '123', '4567']
['이건뭔가""', '이런경우"', '제대로 될까"']
["'이건", "띠리리'", "'띠리리"]
['  T " "', '  " T " " "', '  " " T " " " "']

약간 제대로 된것 같기도 한데, 아직 오동작 합니다.

처리 하지 않기

이걸 해결하기 위해서는 " 처리를 전혀 하지 않고 읽어봅니다.
quoting = csv.QUOTE_NONE 처리를 하면 됩니다.

with open('1.csv', encoding='utf-8') as csvfile:
 reader = csv.reader(csvfile, delimiter=',', quotechar='"', quoting = csv.QUOTE_NONE)
 for row in reader:
  print(row)

결과를 살펴보면 처리가 하나도 안되어 있음을 알 수 있습니다.
['"한글"', '"테스트"', '"CSV"']
['"한글"', '123', '4567']
['""이건뭔가""', '""이런경우"', '"제대로 될까""']
['"\'이건"', '"띠리리\'"', '"\'띠리리"']
['" " T " "', '" " " T " " "', '" " " " T " " " "']


최종 처리

" 처리는 어렵지 않습니다, 처음과 끝에 " 가 존재하는 경우 삭제하면 됩니다.

with open('1.csv', encoding='utf-8') as csvfile:
 reader = csv.reader(csvfile, delimiter=',', quotechar='"', quoting = csv.QUOTE_NONE)
 for row in reader:
  newlist = []
  for value in row:
   if type(value)==str and value.startswith('"') and value.endswith('"'):
    newlist.append(value[1:len(value)-1])
   else:
    newlist.append(value)
  print(newlist)

['한글', '테스트', 'CSV']
['한글', '123', '4567']
['"이건뭔가"', '"이런경우', '제대로 될까"']
["'이건", "띠리리'", "'띠리리"]
[' " T " ', ' " " T " " ', ' " " " T " " " ']

완벽하게 처리 되었습니다.

댓글 없음:

댓글 쓰기