Python을 사용하여 CSV 파일을 편집 할 때 헤더를 건너 뜁니다


209

아래 참조 코드를 사용하여 Python을 사용하여 CSV를 편집하고 있습니다. 코드에서 호출 된 함수는 코드의 상단을 형성합니다.

문제 : 아래 참조 된 코드가 두 번째 행에서 CSV를 편집하기 시작하고 헤더가 포함 된 첫 번째 행을 제외하고 싶습니다. 지금은 첫 번째 행에서만 기능을 적용하고 헤더 행이 변경되고 있습니다.

in_file = open("tmob_notcleaned.csv", "rb")
reader = csv.reader(in_file)
out_file = open("tmob_cleaned.csv", "wb")
writer = csv.writer(out_file)
row = 1
for row in reader:
    row[13] = handle_color(row[10])[1].replace(" - ","").strip()
    row[10] = handle_color(row[10])[0].replace("-","").replace("(","").replace(")","").strip()
    row[14] = handle_gb(row[10])[1].replace("-","").replace(" ","").replace("GB","").strip()
    row[10] = handle_gb(row[10])[0].strip()
    row[9] = handle_oem(row[10])[1].replace("Blackberry","RIM").replace("TMobile","T-Mobile").strip()
    row[15] = handle_addon(row[10])[1].strip()
    row[10] = handle_addon(row[10])[0].replace(" by","").replace("FREE","").strip()
    writer.writerow(row)
in_file.close()    
out_file.close()

row변수를 초기화 하여이 문제를 해결하려고했지만 1작동하지 않았습니다.

이 문제를 해결하도록 도와주세요.


답변:


370

귀하의 reader변수는이 반복 가능한, 그 위에 반복하여이 행을 검색합니다.

루프 전에 한 항목을 건너 뛰려면 next(reader, None)반환 값을 호출 하고 무시하십시오.

코드를 약간 단순화 할 수도 있습니다. 열린 파일을 컨텍스트 관리자로 사용하여 자동으로 닫으십시오.

with open("tmob_notcleaned.csv", "rb") as infile, open("tmob_cleaned.csv", "wb") as outfile:
   reader = csv.reader(infile)
   next(reader, None)  # skip the headers
   writer = csv.writer(outfile)
   for row in reader:
       # process each row
       writer.writerow(row)

# no need to close, the files are closed automatically when you get to this point.

당신이 너무 쉽게 처리되지 않은 출력 파일에 헤더를 쓰고 싶다 경우의 출력 통과 next()로를 writer.writerow():

headers = next(reader, None)  # returns the headers or `None` if the input is empty
if headers:
    writer.writerow(headers)

22
대안은 또한 사용하는 것입니다 for row in islice(reader, 1, None)next대부분의 간단한 "한 줄 건너 뛰기"작업 보다 덜 명시 적이지만 여러 헤더 행을 건너 뛰거나 특정 청크 만 얻는 등의 경우 매우 편리합니다
Jon Clements

내가 사용하는 것이 좋습니다 것try: writer.write(next(reader))... except StopIteration: # handle empty reader
존 클레멘트

@JonClements : 아마도. 이것은 try:/ 에 대해 가르 칠 필요없이 충분히 잘 작동합니다 except:.
Martijn Pieters

1
@JonClements : 명시적인 next반복의 장점 은 "무료"라는 점입니다. 각 반복에 영구적으로 추가되는 (아주 적은 양의) 오버 헤드를 islice래핑합니다 reader. consume에서 조리법itertools (가) 어디에 경우, 이후의 사용에 포장을 추가하지 않고, 신속하게 많은 값을 생략 할 수 있습니다 islice이 없을 것입니다 start하지만이 end오버 헤드는 당신에게 무엇을 얻고되지 않도록.
ShadowRanger

120

이 문제를 해결하는 또 다른 방법은 DictReader 클래스를 사용하는 것입니다. DictReader 클래스는 헤더 행을 "건너 뛰고"사용하여 명명 된 인덱싱을 허용합니다.

"foo.csv"는 다음과 같습니다.

FirstColumn,SecondColumn
asdf,1234
qwer,5678

다음과 같이 DictReader를 사용하십시오.

import csv
with open('foo.csv') as f:
    reader = csv.DictReader(f, delimiter=',')
    for row in reader:
        print(row['FirstColumn'])  # Access by column header instead of column number
        print(row['SecondColumn'])

21
질문이 XY 문제 의 예 인 것처럼 보이므로 이것이 실제 답변 인 것 같습니다 .
MariusSiuram

3
DictReader는 확실히 갈 길입니다
Javier Arias

4
DictReader를 구성 할 때 field names 매개 변수를 생략 한 경우에만 작동합니다. 문서 별 : If the fieldnames parameter is omitted, the values in the first row of the file f will be used as the fieldnames.참조 docs.python.org/2/library/csv.html
BuvinJ

7

이렇게 row=1아무것도 변경되지 않습니다 당신이 것이기 때문에 그냥 덮어 그 루프의 결과.

당신은하고 싶은 next(reader)하나 개의 행을 건너 뜁니다.


나는 그것을 변화 시도 for row in next(reader):하지만 나에게주고 IndexError: string index out of range오류

for 루프 전에 사용하십시오 : next(reader); for row in reader:....
dlazesz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.