2017-09-09 120 views
1

你好我正在嘗試做一個程序來更新csv中的值。用戶搜索該ID,如果該ID存在,它會在該ID號所在的行上獲取要替換的新值。這裏row[0:9]是我的ID的長度。如何更新CSV文件中的行

我的想法是掃描每一行從0-9或我的身份證號碼是什麼,當它發現時,我會用.replace()方法替換除了它之外的值。這是怎麼做到的:

def update_thing(): 
     replace = stud_ID +','+ stud_name +','+ stud_course +','+ stud_year 
     empty = [] 
     with open(fileName, 'r+') as upFile: 
      for row in f: 
       if row[0:9] == stud_ID: 
        row=row.replace(row,replace) 
        msg = Label(upd_win, text="Updated Successful", font="fixedsys 12 bold").place(x=3,y=120) 
       if not row[0:9] == getID: 
        empty.append(row) 

     upFile.close() 
     upFile = open(fileName, 'w') 
     upFile.writelines(empty) 
     upFile.close() 

但它不工作,我需要如何通過這個想法。

Screenshot

+0

你能提供你的CSV數據的剪輯嗎?另外,你有熊貓嗎? –

+0

不要嘗試手動執行此操作。相反,使用Python CSV包'csv'。它將解碼和編碼CSV文件的行,自動處理所有的轉義。 –

+0

@COLDSPEED先生我添加了圖像。 –

回答

0

隨着csv模塊,您可以遍歷行和訪問每一個作爲一個字典。同樣注意到here,更新文件的優先方式是使用臨時文件。

from tempfile import NamedTemporaryFile 
import shutil 
import csv 

filename = 'my.csv' 
tempfile = NamedTemporaryFile(mode='w', delete=False) 

fields = ['ID', 'Name', 'Course', 'Year'] 

with open(filename, 'r') as csvfile, tempfile: 
    reader = csv.DictReader(csvfile, fieldnames=fields) 
    writer = csv.DictWriter(tempfile, fieldnames=fields) 
    for row in reader: 
     if row['ID'] == str(stud_ID): 
      print('updating row', row['ID']) 
      row['Name'], row['Course'], row['Year'] = stud_name, stud_course, stud_year 
     row = {'ID': row['ID'], 'Name': row['Name'], 'Course': row['Course'], 'Year': row['Year']} 
     writer.writerow(row) 

shutil.move(tempfile.name, filename) 

如果這仍然沒有工作,你可以嘗試下面的編碼之一:

with open(filename, 'r', encoding='utf8') as csvfile, tempfile: 
with open(filename, 'r', encoding='ascii') as csvfile, tempfile: 

編輯:加STR,打印和編碼

+0

謝謝先生,你的代碼工作,因爲它沒有得到失敗的消息。但仍然沒有被取代。 –

+0

我通過使用r + b使我的代碼工作正常,但您的代碼在使用該包時仍然更好。但是,仍然像我一樣,它不會改變 –

+0

rb vs r是我相信的Python 2 vs 3問題。也許你需要將stud_ID轉換爲字符串?str(stud_ID) – brennan

0

簡單地寫在同時一個新的文件讀取過原始行,根據Stud_ID值有條件地更改該行。新文件的後綴名稱爲_新

line_replace = stud_ID +','+ stud_name +','+ stud_course +','+ stud_year 

with open(fileName, 'r') as readFile, open(fileName.replace('.csv', '_new.csv'), 'w') as writeFile: 
    for row in readFile: 
     if row[0:9] == stud_ID: 
     writeFile.write(line_replace) 
     msg = Label(upd_win, text="Updated Successful", font="fixedsys 12 bold").place(x=3,y=120) 
     else: 
     writeFile.write(row) 
+0

您好先生,您的代碼會刪除所有內容。 .csv和_new.csv會在這裏自動創建嗎? –

+0

很奇怪。文件被刪除或文件中的內容被刪除?這裏沒有文件系統處理。不應該從該代碼中刪除文件或內容,並且應該創建* _new *。我剛測試過。也許其他代碼會刪除。你在使用Python 3嗎? – Parfait