2016-02-12 136 views
9

我應該添加一個特定的標籤到我的CSV文件基於關閉條件。 CSV文件有10列,第三列,第四列和第五列是影響最多的條件,我在第十列添加我的標籤。我的代碼在這裏以無限循環結束:CSV寫入文件困難

import csv 
import sys 

w = open(sys.argv[1], 'w') 
r = open(sys.argv[1], 'r') 

reader = csv.reader(r) 
writer = csv.writer(w) 

for row in reader: 
    if row[2] or row[3] or row[4] == '0': 
     row[9] == 'Label' 
     writer.writerow(row) 

w.close() 
r.close() 

我不知道它爲什麼會以無限循環結束。

編輯:我犯了一個錯誤,我原來的無限循環程序有這樣一行:

w = open(sys.argv[1], 'a') 

我改變'a''w'但最終,在全部擦除CSV文件本身。所以現在我有一個不同的問題。

+1

'if row [2] =='0'or row [3] =='0'or row [4] =='0':' –

+1

這是什麼語言? –

+0

@EricJ。對於那個很抱歉。我將它添加到標籤 – Reginsmal

回答

8

你有問題就在這裏if row[2] or row[3] or row[4] == '0':這裏row[9] == 'Label',您可以使用any檢查幾個變量等於相同的值,並使用=分配一個值,還我會建議使用with open

此外,您無法讀取並在csv文件同時寫入,所以你需要更改保存到一個新的csv文件,你可以刪除後的原始和重命名使用os.removeos.rename新一:

import csv 
import sys  
import os 

with open('some_new_file.csv', 'w') as w, open(sys.argv[1], 'r') as r: 
    reader, writer = csv.reader(r), csv.writer(w) 
    for row in reader: 
     if any(x == '0' for x in (row[2], row[3], row[4])): 
      row[9] = 'Label' 
     writer.writerow(row) 

os.remove('{}'.format(sys.argv[1])) 
os.rename('some_new_file.csv', '{}'.format(sys.argv[1])) 
+0

謝謝這阻止了程序在追加模式下的無限循環。然而,由於沒有添加標籤,它似乎沒有正常工作。 – Reginsmal

+1

還有另外一個問題,你不能打開同一個文件進行寫入和讀取 – tinySandy

+0

我試圖改變'sys.argv [1]'將其寫入'test.csv',並且必須讀取文件。但'test.csv'結束了原來的一樣。 – Reginsmal

0

我認爲這個問題是在線路

w = open(sys.argv[1], 'w') 
r = open(sys.argv[1], 'r') 

您正在打開同一個文件進行讀取和writing.So嘗試使用不同的文件名。

4

你可以寫一個tempfile.NamedTemporaryFile,只需使用in,以測試"0"因爲你是相匹配的完整的字符串不是一個字符串,從而創建三個元素的元組,你將不會被使用任何保存任何所以你可以切片或者只是測試成員資格,然後你只需用替換原始文件:

import csv 
import sys  
from shutil import move 
from tempfile import NamedTemporaryFile 

with NamedTemporaryFile("w", dir=".", delete=False) as w, open(sys.argv[1]) as r: 
    reader, writer = csv.reader(r), csv.writer(w) 
    writer.writerows(row[:-1] + ['Label'] if "0" in row[2:5] else row 
        for row in reader) 

move(w.name, sys.argv[1]) 

sys.argv[1]也是你的文件名和一個字符串,所以這是所有你需要傳遞。

+0

我給你我的賞金,因爲你是唯一一個發佈除我以外的好答案 – tinySandy