2009-07-29 4 views
3

CSV 파일에서 여러 줄의 줄을 추출하여 다른 줄에 쓰려고하는데 문제가 있습니다. 나는 동 틀렸다 무엇Python CSV DictReader/Writer issues

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 

완전히 확실하지 :

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() 

이 실행, 나는 다음과 같은 오류가 발생합니다.

답변

13

나도 몰라.하지만 한 파일에서 다른 파일로 행을 복사하는 이유는 무엇입니까? csv을 사용하는 것이 어떨까요? 하지 뭔가를 좋아하는 이유 : 예외에 관해서는

f = open("my_csv_file.csv", "r") 
target = open("united.csv", 'w') 

f.readline() 
f.readline() 
for line in f: 
    target.write(line) 
+0

브릴리언트에 설명되어 있습니다. 나는 일을 과장하는 경향이 있습니다. 감사. – saturdayplace

+0

기본 문제를 해결하기 때문에이 답변은 훌륭합니다.) – Jaykul

1

,이 라인과 같습니다

w = csv.DictWriter(united, fieldnames=fieldnames) 

w = csv.DictWriter(target, fieldnames=fieldnames) 
1

오류를 얻고있는 이유는 대부분의 가능성이 있어야한다 원본 CSV 파일 (my_csv_file.csv)에는 헤더 행이 없습니다. 따라서 reader 객체를 구성 할 때 해당 fieldnames 필드는 None으로 설정됩니다.

당신이 작가를 사용하여 행을 작성하려고

, 최초로 확인 알려진 필드의 목록에없는 DICT에는 키가 없는지 확인합니다. fieldnamesNone으로 설정되었으므로 키 이름을 역 참조하려고 시도하면 예외가 발생합니다.

13

r을 사용하여 입력 파일에서 처음 읽으면 r.fieldnames이 설정되기 때문에 오류에 대한 혼란을 해결할 수 있습니다. 따라서 당신이 작성한 방식은 fieldnames이며 항상 None으로 초기화됩니다.

r에서 첫 번째 줄을 읽은 후에 만 ​​w = csv.DictWriter(united, fieldnames=fieldnames)r.fieldnames으로 초기화 할 수 있습니다. 즉, 코드를 다시 구성해야합니다.

이 문제가 Python Standard Library documentation

DictReader objects have the following public attribute:

csvreader.fieldnames

If not passed as a parameter when creating the object, this attribute is initialized upon first access or when the first record is read from the file.

+1

이 답변은 오류를 해결하기 때문에 훌륭합니다 ... – Jaykul