문제
CSV 파일에서 여러 줄을 추출하여 다른 파일에 쓰려고 하는데 몇 가지 문제가 있습니다.
import csv
f = open("my_csv_file.csv", "r")
r = csv.DictReader(f, delimiter=',')
fieldnames = r.fieldnames
target = open("united.csv", 'w')
w = csv.DictWriter(united, fieldnames=fieldnames)
while True:
try:
row = r.next()
if r.line_num <= 2: #first two rows don't matter
continue
else:
w.writerow(row)
except StopIteration:
break
f.close()
target.close()
이것을 실행하면 다음과 같은 오류가 발생합니다.
Traceback (most recent call last):
File "unify.py", line 16, in <module>
w.writerow(row)
File "C:\Program Files\Python25\lib\csv.py", line 12
return self.writer.writerow(self._dict_to_list(row
File "C:\Program Files\Python25\lib\csv.py", line 12
if k not in self.fieldnames:
TypeError: argument of type 'NoneType' is not iterable
내가 뭘 잘못하고 있는지 완전히 확신할 수 없습니다.
해결책
나도 모르겠지만, 당신이하는 일은 한 파일에서 다른 파일로 줄을 복사하는 것입니다. csv
전혀? 왜 :
f = open("my_csv_file.csv", "r")
target = open("united.csv", 'w')
f.readline()
f.readline()
for line in f:
target.write(line)
다른 팁
오류에 대한 혼란을 해결하려면 다음을 수행하십시오.당신은 그것을 얻습니다 왜냐하면 r.fieldnames
다음을 사용하여 처음으로 입력 파일에서 읽을 때만 설정됩니다. r
.그러므로 당신이 쓴 방식은, fieldnames
항상 초기화됩니다 None
.
초기화할 수 있습니다 w = csv.DictWriter(united, fieldnames=fieldnames)
~와 함께 r.fieldnames
첫 번째 줄을 읽은 후에야 r
, 이는 코드를 재구성해야 함을 의미합니다.
이 동작은 Python 표준 라이브러리 문서
DictReader 객체에는 다음과 같은 공개 속성이 있습니다.
csvreader.필드 이름
객체를 생성할 때 매개변수로 전달되지 않으면 이 속성은 처음 액세스할 때 또는 파일에서 첫 번째 레코드를 읽을 때 초기화됩니다.
예외는이 줄처럼 보입니다.
w = csv.DictWriter(united, fieldnames=fieldnames)
해야한다
w = csv.DictWriter(target, fieldnames=fieldnames)
오류가 발생한 이유는 원래 CSV 파일 (my_csv_file.csv)에 헤더 행이 없을 가능성이 높습니다. 따라서 독자 객체를 구성하면 필드 이름 필드가 설정됩니다. None
.
작가를 사용하여 행을 쓰려고 할 때, 먼저 알려진 필드 목록에없는 딕에 키가 없는지 확인합니다. 부터 fieldnames
설정되었습니다 None
, 키 이름을 피하려는 시도는 예외를 던졌습니다.