2017-03-23 93 views
0

我想添加一些隨機數據到文本文件,我很成功,但我面臨的問題與標題行。我想添加標題行一次,然後每次運行我的腳本時,它應該只添加數據到文件並忽略標題行(如果存在)。我嘗試過這樣的事情,但我失敗了。我試圖看看SO python csv, writing headers only once中的這個示例代碼,但無法正確實施。 如果有人幫我糾正我的代碼。我會很感激。python csv頭忽略,同時不斷追加數據到csv文件

import random 
import csv 
import os.path 
from time import gmtime, strftime 

filename = '/home/robdata/collection1.dat' 

file_exists = os.path.isfile(filename) 

v = random.randint(0, 100) 

with open(filename, "a") as csvfile: 
    headers = ['DATE', 'value'] 
    writer = csv.DictWriter(csvfile, delimiter=',', lineterminator='\n',fieldnames=headers) 
    if not file_exists: 
     writer.writeheader() # file doesn't exist yet, write a header 

    writer.writerow({'DATE': strftime("%Y-%m-%d %H:%M:%S", gmtime()), 'value': v}) 

它插入數據,但不添加任何標題行。我想在腳本的第一次運行中包含標題,下次當我多次運行腳本時,它只應添加數據而不是標題行。非常感謝任何想法或幫助。

+0

你能編輯成問題的是什麼你的代碼是做正確的描述? – glibdud

+0

@glibdud我在下面添加我的問題。我能夠插入數據到文件中,但沒有任何標題。 – rob

+0

第一次運行它(在文件存在之前),你應該得到一個AttributeError。看看你的'csv.writer'對象與你鏈接問題中使用的內容之間的區別。 – glibdud

回答

2

A至埃文斯先生方法稍微簡單替代方案將是使用下面的測試代替試驗的存在:

fileEmpty = os.stat(「collection1.dat」)st_size == 0

這消除了尋求等的需要。

編輯:完整代碼:

import random 
import csv 
import os.path 
from time import gmtime, strftime 

filename = '/home/robdata/collection1.dat' 

fileEmpty = os.stat(filename).st_size == 0 

v = random.randint(0, 100) 

with open(filename, "a") as csvfile: 
    headers = ['DATE', 'value'] 
    writer = csv.DictWriter(csvfile, delimiter=',', lineterminator='\n',fieldnames=headers) 
    if fileEmpty: 
     writer.writeheader() # file doesn't exist yet, write a header 

    writer.writerow({'DATE': strftime("%Y-%m-%d %H:%M:%S", gmtime()), 'value': v}) 
+0

非常感謝你的幫助。根據我的要求,上述問題中的代碼完美無缺。 thanx的幫助。 – rob

+0

你想粘貼答案,以便我接受,因爲你首先編輯我的問題代碼,它工作正常。我問你,因爲你先編輯它。 – rob

+0

非常歡迎。如果這個答案是對你有幫助的那個,那麼SO上的禮儀就是讓你把它標記爲'接受'。當你有更多的積分時,你將被允許投票。 –

1

從Python CSV模塊的文檔中,writeheader只能用於DictWriter。 [https://docs.python.org/2/library/csv.html#csv.DictWriter.writeheader][Documentation writeheader]

因此,代碼不應該使用writeheader。 你可以試試這個。

if not file_exists: 
    writer.writerow(headers) 
else: 
    writer.writerow([strftime("%Y-%m-%d %H:%M:%S", gmtime()), v, w, z]) 
+0

我編輯我的問題。但我之前嘗試過這個想法,而且我得到了這個錯誤。 ValueError:dict包含不在字段名中的字段:'2017-03-23 13:59:39',94 – rob

+0

我複製了你的新代碼並運行它。它工作正常。 –

1

看起來你在我們發佈答案時編輯了你的問題。請將所有更改添加爲修改或提及已更改的內容。無論如何,雖然字典領域不同,但概念是一樣的。

dictwriter之上,您需要將行數據作爲值傳遞給每列的dict鍵。

我爲5次寫入添加了一個循環,延遲5秒作爲示例。
見下文。

工作代碼:

import random 
import csv 
import os.path 
from time import gmtime, strftime, sleep 

filename = 'collection1.csv' 

file_exists = os.path.isfile(filename) 

v = random.randint(0, 100) 
w = random.randint(0, 100) 
z = random.randint(0, 100) 
with open(filename, "a") as csvfile: 
    for i in range(5):   
     headers = ['timestamp','val1', 'val2', 'val3'] 
     writer = csv.DictWriter(csvfile, delimiter=',', lineterminator='\n',fieldnames=headers) 
     if not file_exists: 
      writer.writeheader() 
     else: 
      mytime = strftime("%Y-%m-%d %H:%M:%S", gmtime()) 
      writer.writerow({'timestamp':mytime, 'val1': v,'val2': w, 'val3':z}) 

     sleep(5) 

collection1.csv

timestamp,val1,val2,val3 
2017-03-23 14:07:20,83,60,11 
2017-03-23 14:07:25,83,60,11 
2017-03-23 14:07:30,83,60,11 
2017-03-23 14:07:47,55,44,88 
2017-03-23 14:07:52,55,44,88 
2017-03-23 14:07:57,55,44,88 
2017-03-23 14:08:02,55,44,88 
2017-03-23 14:08:07,55,44,88 
+0

我試過你的代碼,但我得到了相同的結果。等待我再次檢查代碼。我會盡快回來更新。非常感謝您的幫助。 – rob

+0

只需複製/粘貼我的代碼。它在努力工作。這是你的舊代碼(已修改)。讓我知道。 –

+0

@accept我的道歉,我沒有通知,並補充說我編輯我的代碼。下次我會小心的。 – rob

2

,而不是測試文件是否存在,你可以改爲檢查通過尋求的,看是否具有零長度結束並詢問文件位置。然後,這將爲文件爲空但仍然存在的情況寫入標題。

import random 
import csv 
from time import gmtime, strftime 

headers = ['DATE', 'value'] 
v = random.randint(0, 100) 

with open('collection1.dat', 'ab') as f_output: 
    csv_output = csv.DictWriter(f_output, fieldnames=headers) 
    f_output.seek(0, 2) 

    if f_output.tell() == 0: 
     csv_output.writeheader() 

    csv_output.writerow({'DATE': strftime("%Y-%m-%d %H:%M:%S", gmtime()), 'value': v})   

writeheader()然後用於只在文件爲空時才寫入標題。

此外,使用csv庫時,應始終以二進制模式打開文件,例如ab

+0

非常感謝你的幫助。 – rob