古いcsvファイルpythonに新しい行を追加する


208

古いcsvファイルに新しい行を追加しようとしています。基本的に、Pythonスクリプトを実行するたびに更新されます。

現在、古いcsvの行の値をリストに格納してから、csvファイルを削除して、新しいリストの値で再度作成しています。

これを行うためのより良い方法はありますか?

回答:


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

'a'パラメータを使用してファイルを開くと、既存のコンテンツを単に上書きする代わりに、ファイルの末尾に追加できます。やってみて。


2
私はfp = open(csv_filepathwithname、 'wa')ライター= csv.writer(fp)somelist = [3,56,3,6,56] writer.writerow((somelist))を試しましたが、最後の行だけがファイル。
laspal、2010年

このメソッドは、追加される項目がカンマで区切られていることを前提としていますが、常にそうであるとは限りません。その後、書き込みメソッドはcsv区切り文字を維持しません。以下の答えは、その意味でより堅牢です。
sheth7

153

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が発生します。Pythonでは「str」、Python 3.6ではCSVではなく、バイトのようなオブジェクトが必要です。を追加するnewline=''と、Natachaが示唆するように、Python 2とPython 3の間で後方互換性がなくなります。


24

@GMの回答に基づき、@ John La Rooyの警告に注意を払って、ファイルを'a'モードで開く新しい行を追加することができました。

Windowsでも、改行の問題を回避するために、として宣言する必要があります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 docsのファイルの読み取りと書き込みを参照してください。

7.2。ファイルの読み取りと書き込み

open()はファイルオブジェクトを返し、open(filename、mode)という2つの引数とともに最もよく使用されます。

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

最初の引数はファイル名を含む文字列です。2番目の引数は、ファイルの使用方法を説明するいくつかの文字を含む別の文字列です。モードは、ファイルを読み取るだけの場合は「r」、書き込みのみの場合は「w」(同じ名前の既存のファイルは消去されます)、「a」は追加のためにファイルを開きます。ファイルに書き込まれたデータは自動的に最後に追加されます。'r +'は、ファイルを読み取りと書き込みの両方で開きます。mode引数はオプションです。省略した場合は「r」とみなされます。

Windowsでは、モードに追加された「b」はバイナリモードでファイルを開くため、「rb」、「wb」、「r + b」などのモードもあります。Windows上のPythonでは、テキストファイルとバイナリファイルを区別しています。テキストファイルの行末文字は、データの読み取りまたは書き込み時に自動的にわずかに変更されます。ファイルデータに対するこの舞台裏の変更は、ASCIIテキストファイルでは問題ありませんが、JPEGファイルやEXEファイルのようなバイナリデータは破損します。そのようなファイルを読み書きするときは、バイナリモードを使用するように十分注意してください。Unixでは、モードに「b」を追加しても問題ないため、すべてのバイナリファイルに対してプラットフォームに依存せずに使用できます。


あなたはあなたの答えをより精巧にすることができるかもしれません、そしてそれは本当の答えのように見えるでしょう:-)
user702846

@ユーザー、私はリンクを追加しました-それはあなたを助けますか?
John La Rooy、2011

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
インデントを修正してください。回答にも説明が役立ちます-これらの回答もより多くの賛成票を集めます。
T氏

これは簡単なコードで、ファイルを追加モードで開き、ヘッダーレコードを書き出して、aListのビデオレコードを処理します。
markkaufman 2018年

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.