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

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

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

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



답변

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

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


답변

파일을 열어 두지 않기 위해 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 사이의 역 호환성 이 발생합니다 .


답변

@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 제외)와 함께 시도하지 않았지만 괜찮을 것이라고 생각합니다.


답변

‘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’를 모드에 추가하는 것이 아프지 않으므로 모든 바이너리 파일에 대해 플랫폼 독립적으로 사용할 수 있습니다.


답변

파일이 존재하고 데이터를 포함하는 경우 자동으로 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)


답변

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


답변

이 방식으로 .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")