Python 방식으로 csv 파일에 헤더 추가


84

두 개의 csv 파일을 병합하는 Python 스크립트를 작성했으며 이제 최종 csv에 헤더를 추가하고 싶습니다. 여기에 보고 된 제안을 따르려고했는데 다음과 같은 오류가 발생 expected string, float found했습니다.. 이 문제를 해결하는 가장 비단뱀적인 방법은 무엇입니까?

내가 사용하는 코드는 다음과 같습니다.

import csv

with open('combined_file.csv', 'w', newline='') as outcsv:
    writer = csv.DictWriter(outcsv, fieldnames = ["Date", "temperature 1", "Temperature 2"])
    writer.writeheader()

    with open('t1.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row + [0.0] for row in reader)

    with open('t2.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row[:1] + [0.0] + row[1:] for row in reader)

csv 파일에 몇 개의 열을 쓰고 있습니까? 질문에 지정해 주시겠습니까 1. 파일의 입력 형식 2. 출력 형식
nio

@nio : 코드의 큰 섹션을 게시 출신 영업으로이 이전 질문
마티 피에 터스

답변:


115

DictWriter()클래스는 기대하고 사전에 각 행을. 원하는 것이 초기 헤더를 작성하는 것 csv.writer()뿐 이라면 일반 헤더를 사용하고 헤더 에 대한 간단한 행을 전달하십시오.

import csv

with open('combined_file.csv', 'w', newline='') as outcsv:
    writer = csv.writer(outcsv)
    writer.writerow(["Date", "temperature 1", "Temperature 2"])

    with open('t1.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row + [0.0] for row in reader)

    with open('t2.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row[:1] + [0.0] + row[1:] for row in reader)

대안은 데이터를 복사 할 때 사전을 생성하는 것입니다.

import csv

with open('combined_file.csv', 'w', newline='') as outcsv:
    writer = csv.DictWriter(outcsv, fieldnames = ["Date", "temperature 1", "Temperature 2"])
    writer.writeheader()

    with open('t1.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows({'Date': row[0], 'temperature 1': row[1], 'temperature 2': 0.0} for row in reader)

    with open('t2.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows({'Date': row[0], 'temperature 1': 0.0, 'temperature 2': row[1]} for row in reader)

1
바이너리 모드에서 파일이 열리는 이유는 무엇입니까? csv 파일은 바이너리 형식이 아니라 텍스트입니다. 이로 인해 Windows 시스템에서 문제가 발생할 수 있습니다.
pcarter

3
@pcarter : Python 2에서 Windows에서 텍스트 모드로 파일을 열면 CSV 형식과 호환되지 않는 개행 번역이 트리거됩니다. csv모듈은 따라서 직접 (사용 줄 바꿈을 처리하고 싶어 \n하고 \r\n바이너리 모드로 파일을 열어야하는 수단, 필요에 따라). csv.reader()문서 참조 : csvfile이 파일 객체 인 경우 차이점이있는 플랫폼에서 'b'플래그로 열어야합니다. . Python 3에서는 대신 newline=''옵션을 사용합니다.
Martijn Pieters

이것은 작동합니다. 재미있는 것 : 파일이 a모드에서 열리면 writer.writeheader()헤더 행이 이미 작성 되었음에도 불구하고 헤더를 두 번 기록합니다!
loretoparisi

2
@loretoparisi : 물론 그렇습니다. writer.writeheader()기존 파일에 추가 할 때는 사용하지 마십시오 . csv.writer()객체를 사용하면 기존 파일에 데이터를 작성하는 것을 감지 할 수 없습니다.
Martijn Pieters

Python 3에서는 'w'옵션으로 파일을 열어야하며 바이너리가 작동하지 않습니다. 답변에서 이것을 언급하는 것이 유용 할 것입니다. 여기이 차이를 발견 stackoverflow.com/questions/34283178/...
크리스토프에게

6

루프를 실행하기 전에 행을 하나만 추가하면됩니다. 이 행에는 CSV 파일 헤더 이름이 포함됩니다.

schema = ['a','b','c','b']
row = 4
generators = ['A','B','C','D']
with open('test.csv','wb') as csvfile:    
     writer = csv.writer(csvfile, delimiter=delimiter)
# Gives the header name row into csv
     writer.writerow([g for g in schema])   
#Data add in csv file       
     for x in xrange(rows):
         writer.writerow([g() for g in generators])

3

이것은 나를 위해 일했습니다.

header = ['row1', 'row2', 'row3']
some_list = [1, 2, 3]
with open('test.csv', 'wt', newline ='') as file:
    writer = csv.writer(file, delimiter=',')
    writer.writerow(i for i in header)
    for j in some_list:
        writer.writerow(j)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.