2016-04-05 9 views
0

データを.csvファイルから取得し、タプルのリストに分割し、これを処理してから、変更を元に戻します。 CSVファイル。私の問題は、データを置き換える代わりに、私のファイルの最後に変更を新しい行として追加していることです。私はファイルを再オープンし、csvモジュールを使用することを避けようとしています。以下のコードは私がタプルのリストとして保存し、これをファイルに保存しようとしていますが、代わりにファイルを追加しています。csvをr +で開き、ファイルの末尾に書き込んでいます

items_data = open("test.csv", "r+") 
my_list = items_data.read().strip().split('\n') 
for line in range(len(my_list)): 
    my_list[line] = tuple(my_list[line].split(",")) 
for i in range(len(my_list)): 
    for a in range(0,4): 
     if a==3: 
      items_data.write(my_list[i][a] + "\n") 
     else: 
      items_data.write(my_list[i][a] + ",") 
items_data.close() 
+0

通常、新しいファイルにデータを書き込んでから、すべてが正常になったら名前を変更する方が良いです。それ以外の場合は、プログラムにランタイムエラーがある場合、ファイルが混乱する可能性があります。 – Marichyasana

答えて

0

'r +'は、読み書きの両方のファイルを開きます。 f.seek(offset)を使用して位置を指定しない限り、書き込みは最後になります。そのため、各行のオフセット値を計算するのではなく、ファイル全体を読み込み、各行を処理してファイル全体に書き戻す方が簡単です。

0

ファイルから読み込むと、「ファイルポインタ」が移動します。すべての行を読み込んだので、ファイルポインタはファイルの終わりを指しています。したがって、ファイルの最後にさらに書き込みが行われています。

ファイルの先頭から書き込みをするには、あなたが戻ってデータの書き込みを開始する前に実行して、ファイルの先頭にファイルポインタをリセットする必要があります。

items_data.seek(0,0) 

変更したコードは次のようになります。

items_data = open("test.csv", "r+") 
my_list = items_data.read().strip().split('\n') 
for line in range(len(my_list)): 
    my_list[line] = tuple(my_list[line].split(",")) 

# rewind file pointer to the start of the file 
items_data.seek(0,0) 

for i in range(len(my_list)): 
    for a in range(0,4): 
     if a==3: 
      items_data.write(my_list[i][a] + "\n") 
     else: 
      items_data.write(my_list[i][a] + ",") 
items_data.close() 
関連する問題