오래된 CSV 파일 파이썬에 새 행 추가


207

이전 CSV 파일에 새 행을 추가하려고합니다. 기본적으로 파이썬 스크립트를 실행할 때마다 업데이트됩니다.

지금은 오래된 csv 행 값을 목록에 저장 한 다음 csv 파일을 삭제하고 새 목록 값으로 다시 만듭니다.

이 작업을 수행하는 더 좋은 방법이 있는지 알고 싶었습니다.

답변:


246
with open('document.csv','a') as fd:
    fd.write(myCsvRow)

'a'매개 변수를 사용 하여 파일을 열면 기존 컨텐츠를 단순히 덮어 쓰지 않고 파일 끝에 추가 할 수 있습니다. 해봐


2
fp = open (csv_filepathwithname, 'wa') writer = csv.writer (fp) somelist = [3,56,3,6,56] writer.writerow ((somelist)) 시도했지만 마지막 행만 추가됩니다. 파일.
laspal

이 방법에서는 추가되는 항목이 쉼표로 구분되어 있다고 가정하지만 항상 그렇지는 않습니다. 그런 다음 write 메소드는 csv 분리 문자를 유지하지 않습니다. 아래의 대답은 그런 의미에서 더 강력합니다.
sheth7

152

파일을 열어 두지 않기 위해 csv표준 라이브러리 의 모듈과 with명령문을 사용 하여이 솔루션을 선호합니다 .

요점은 'a'파일을 열 때 추가하는 데 사용됩니다.

import csv   
fields=['first','second','third']
with open(r'name', 'a') as f:
    writer = csv.writer(f)
    writer.writerow(fields)

Python 2.7을 사용하는 경우 Windows에서 불필요한 새 줄이 발생할 수 있습니다. 그러나 이것을 'ab'대신 사용하여 피하는 것을 피할 수 'a'는 있지만 TypeError를 발생시킵니다 . 파이썬의 'str'과 파이썬 3.6의 CSV아닌 바이트와 유사한 객체가 필요합니다 . newline=''Natacha가 제안한 것처럼을 추가하면 Python 2와 3 사이의 역 호환성 이 발생합니다 .


24

@GM의 대답에 따라 @John La Rooy의 경고에주의를 기울여 파일을 'a'모드 에서 여는 새 행을 추가 할 수있었습니다 .

창에서도 줄 바꿈 문제를 피하려면로 선언해야합니다 newline=''.

이제 파일을 'a'모드없이 (b없이) 열 수 있습니다 .

import csv

with open(r'names.csv', 'a', newline='') as csvfile:
    fieldnames = ['This','aNew']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writerow({'This':'is', 'aNew':'Row'})

나는 일반 작가 (Dict 제외)와 함께 시도하지 않았지만 괜찮을 것이라고 생각합니다.


12

'w'대신 'a'모드로 파일을 열었습니까?

Python 문서에서 파일 읽기 및 쓰기를 참조하십시오.

7.2. 파일 읽기 및 쓰기

open ()은 파일 객체를 반환하며 가장 일반적으로 open (filename, mode)의 두 인수와 함께 사용됩니다.

>>> f = open('workfile', 'w')
>>> print f <open file 'workfile', mode 'w' at 80a0960>

첫 번째 인수는 파일 이름이 포함 된 문자열입니다. 두 번째 인수는 파일이 사용되는 방식을 설명하는 몇 개의 문자를 포함하는 또 다른 문자열입니다. 파일을 읽을 때만 'r', 쓰기 전용 인 'w'(같은 이름의 기존 파일은 지워짐) 및 'a'는 추가 할 파일을 엽니 다. 파일에 기록 된 모든 데이터가 자동으로 끝에 추가됩니다. 'r +'는 읽고 쓸 수있는 파일을 엽니 다. mode 인수는 선택 사항입니다. 생략하면 'r'이 가정됩니다.

Windows에서 모드에 추가 된 'b'는 파일을 이진 모드로 열리므로 'rb', 'wb'및 'r + b'와 같은 모드도 있습니다. Windows의 Python은 텍스트 파일과 이진 파일을 구분합니다. 텍스트 파일의 줄 끝 문자는 데이터를 읽거나 쓸 때 자동으로 약간 변경됩니다. 파일 데이터에 대한 이러한 비하인드 수정은 ASCII 텍스트 파일에 적합하지만 JPEG 또는 EXE 파일에서와 같은 이진 데이터를 손상시킵니다. 이러한 파일을 읽고 쓸 때 바이너리 모드를 사용하도록주의하십시오. 유닉스에서는 'b'를 모드에 추가하는 것이 아프지 않으므로 모든 바이너리 파일에 대해 플랫폼 독립적으로 사용할 수 있습니다.


답변을 더 정교하게 만들 수 있다면 실제 답변처럼 보일 것입니다 :-)
user702846

@user, 링크를 추가했는데 도움이 되나요?
John La Rooy

7

파일이 존재하고 데이터를 포함하는 경우 자동으로 fieldname매개 변수 를 생성 할 수 있습니다 csv.DictWriter.

# read header automatically
with open(myFile, "r") as f:
    reader = csv.reader(f)
    for header in reader:
        break

# add row to CSV file
with open(myFile, "a", newline='') as f:
    writer = csv.DictWriter(f, fieldnames=header)
    writer.writerow(myDict)

6
# I like using the codecs opening in a with 
field_names = ['latitude', 'longitude', 'date', 'user', 'text']
with codecs.open(filename,"ab", encoding='utf-8') as logfile:
    logger = csv.DictWriter(logfile, fieldnames=field_names)
    logger.writeheader()

# some more code stuff 

    for video in aList:
        video_result = {}                                     
        video_result['date'] = video['snippet']['publishedAt']
        video_result['user'] = video['id']
        video_result['text'] = video['snippet']['description'].encode('utf8')
        logger.writerow(video_result) 

1
들여 쓰기를 수정하십시오. 답변은 또한 설명의 이점을 얻습니다. 이러한 답변은 더 많은지지를 얻습니다.
Mr. T

이것은 간단한 코드이며 추가 모드로 파일을 열고 헤더 rec를 작성한 다음 aList의 비디오 레코드를 통해 작동합니다.
markkaufman

2

이 방식으로 .csv 파일에 새 줄을 추가합니다.

pose_x = 1 
pose_y = 2

with open('path-to-your-csv-file.csv', mode='a') as file_:
    file_.write("{},{}".format(pose_x, pose_y))
    file_.write("\n")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.