문제

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, 키 이름을 피하려는 시도는 예외를 던졌습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top