web-dev-qa-db-ja.com

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

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

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

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

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

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

199
inkedmn

ファイルを開いたままにしないように、標準ライブラリの 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 NatachaがPython 3.6で述べたようにnewline=''を追加すると、 Python 2および3 csvモジュールのテキストバイナリモードの後方互換性 の問題が発生します。

112
G M

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

ウィンドウでも、改行の問題を回避するために、newline=''として宣言する必要があります。

これで、'a'mode(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なし)には挑戦しませんでしたが、それでも大丈夫だと思います。

14
Natacha

「w」ではなく「a」モードでファイルを開いていますか?

Pythonドキュメントの ファイルの読み取りと書き込み を参照してください

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」を追加しても問題ありません。したがって、プラットフォームに依存せずにすべてのバイナリファイルに使用できます。

12
John La Rooy
# 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) 
4
markkaufman

ファイルが存在し、データが含まれている場合、csv.DictWriterfieldnameパラメーターを自動的に生成できます。

# 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)
4
Ron Kalian

この方法で、.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")
0
Benyamin Jafari