2017-04-25 105 views
0

我將如何去寫入Python中的CSV文件?在csv文件中查找單元格?

我基本上有2列。第一列是交易名稱列表,第二列是時間。

我需要創建一段代碼,可以在用戶填寫輸入框時更新計時列。

我已經在tkinter中設置了輸入框並設置了文本變量。我可以得到變量,但我遇到的問題是採取文本變量並在csv文件中找到正確的單元格並覆蓋它。

本質上我想找到正確的單元格並粘貼csv文件中的值。

有什麼想法?

感謝

+0

也許檢查模塊'pandas'和函數'read_csv'和'write_csv'? –

回答

2

您可以創建中的臨時文件,該行復制到tmp文件,然後只替換與交易名稱開頭的行。假設一個CSV每行的元組[名稱,值],您可以使用這樣的事情:

from tempfile import mkstemp 
from os import close 
from shutil import move 

def update(filename, name, value): 
    fd, path = mkstemp() 
    with open(path,'w') as tmpfile: 
     with open(filename) as csv: 
      for line in cvs: 
       if line.startswith(name): 
        tmpfile.write(",".join([name,value])) 
       else: 
        tmpfile.write(line) 
    close(fd) 
    move(path, filename) 
+0

不錯的迭代解決方案,儘管OP可能希望使用'csv'模塊來讀取和寫入文件,因爲它可以輕鬆處理現實世界中存在的許多CSV文件格式的方言。 – martineau

1

假設你有一個名爲file.csv文件看起來像這樣:

Col1,Col2 
entry1,timestamp1 
entry2,timestamp2 

您可以使用像這樣的csv庫來修改任何條目,並將其粘貼到一個新.csv.new文件(你可以選擇刪除「新」擴展,但它會覆蓋舊的文件):

import csv 
csv_file = "file.csv" 

file_dict = {} 
with open(csv_file, mode='rb') as f: 
    reader = csv.reader(f) 
    top_row = next(reader) 
    for row in reader: 
     file_dict[row[0]] = row[1] 

# get transaction name and timing 
transaction_name = "entry1" 
timing = "timestamp3" 

# do the update 
file_dict[transaction_name] = timing 

# create updated version of file 
with open(csv_file+".new", mode='wb') as out_f: 
    writer = csv.writer(out_f) 
    writer.writerow(top_row) 
    writer.writerows(file_dict.items()) 

注意這w ^可能會重新安排您的CSV文件。你沒有具體說明這是否是一個問題。如果是可以排序字典或使用OrderedDict。在這裏看到更多的信息: https://docs.python.org/2/library/collections.html#collections.OrderedDict

+0

這需要將整個文件讀入內存,這可能是一個問題(在任何情況下都是不必要的)。 – martineau

+0

我在第一個file_dict = {}上得到上述解決方案的語法錯誤。這是因爲它是函數的第三部分嗎?它開始作爲高清updatetimings(): 問= messagebox.askquestion( '驗證', '你確定要更新定時?') 如果問== '是': 嘗試: \t newv5ctiming =浮動(newv5c獲得()) \t newv62timing =浮子(newv62.get()) \t newdisptiming =浮子(newdisp.get()) \t csv_file = 「Timings.csv」 timings_list = []中的前幾個步驟的工作很好,但是當它命中時會出現語法file_dict = {} –

+0

你得到的錯誤是什麼?您可能需要查看它或發佈另一個溢出問題,如果它尚未在此處。 – supernun