2017-04-11 4 views
0

私のcsvファイルの最後に4文字列を追加するpythonスクリプトがあります。最初の列はユーザ​​ーの電子メールアドレスであり、csvを検索してそのユーザーの電子メールアドレスが既にファイル内にあるかどうかを確認したい場合は、その行全体を4つの新しい文字列で上書きしたいのですが、最後にそれを追加するだけです。私は電子メールの最初の列を検索し、それがあればそれは私に行を与えます。電子メールが行にある場合csv内の特定の行をPython 2.7のインデックスで上書きするにはどうすればいいですか

with open('Mycsvfile.csv', 'rb') as f: 
    reader = csv.reader(f) 
    indexLoop = [] 
    for i, row in enumerate(reader): 
     if userEmail in row[0]: 
      indexLoop.append(i) 
f.close() 
with open("Mycsvfile.csv", 'ab') as file222: 
    writer = csv.writer(file222, delimiter=',') 
    lines = (userEmail, userDate, userPayment, userStatus) 
    writer.writerow(lines) 
file222.close() 

私はこのような何かをしたい、それが私の行のインデックスを与えるだろうと私は私の新しいデータで行全体を上書きするためにそれを使用することができます。それがない場合は、ファイルを最後に追加します。 例:

with open('Mycsvfile.csv', 'rb') as f: 
    reader = csv.reader(f) 
    new_rows = [] 
    indexLoop = [] 
    for i, row in enumerate(reader): 
     if userEmail in row[0]: 
      indexLoop.append(i) 
      new_row = row + indexLoop(userEmail, userDate, userPayment, userStatus) 
      new_rows.append(new_row) 

     else: 
      print "userEmail doesn't exist" 
      #(i'd insert my standard append statement here. 

f.close 
#now open csv file and writerows(new_row)  

答えて

0

まず、あなたは、Pythonがあなたのためにそれをしない、withを使用しているときclose関数を呼び出す必要はありません。

with open("myFile.csv", "r+") as f: 
    # gives you a list of the lines 
    contents = f.readlines() 
    # delete the old line and insert the new one 
    contents.pop(index) 
    contents.insert(index, value) 
    # join all lines and write it back 
    contents = "".join(contents) 
    f.write(contents) 

しかし、私は上の反復、それはファイルを開くには、多くの意味がありませんので、あなたが1つの関数にすべての操作を行うにはrecommandう:あなたは、インデックスを使用している場合

あなたが行うことができますその行を閉じてから、再度開いて更新してください。

1

このため、csvモジュールではなく、Pandasを使用する方がよいでしょう。そうすれば、ファイル全体をメモリに読み込んで変更し、ファイルに書き戻すことができます。
DataFramesの変更が遅いので、追加するデータがたくさんある場合は、そのデータを辞書に変換して戻す方がよいことに注意してください。

import pandas as pd 

file_path = r"/Users/tob/email.csv" 
columns = ["email", "foo", "bar", "baz"] 
df = pd.read_csv(file_path, header=None, names=columns, index_col="email") 
data = df.to_dict('index') 

for email, foo, bar, baz in information: 
    row = {"foo": foo, "bar": bar, "baz"} 
    data[email] = row 

df = pd.DataFrame(data) 
df.to_csv(file_path) 

ここで、informationは、スクリプトが返すものであれば何でも構いません。

+0

完全な答えは、@Batman、+1です。 – bernie

関連する問題