簡體   English   中英

python csv標頭忽略,同時繼續將數據附加到csv文件

[英]python csv header ignore while keep appending data to csv file

我正在嘗試將一些隨機數據添加到文本文件中,並且我成功了,但是我遇到了標題行的問題。 我想添加一次標題行,然后每次運行我的腳本時,它應該只將數據添加到文件中,並忽略標題行(如果存在)。 我試過這樣的事情,但我失敗了。 我嘗試在 SO python 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})

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

埃文斯先生方法的一個稍微簡單的替代方法是使用以下測試代替存在測試:

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})

與其測試文件是否存在,您還可以通過查找到末尾並詢問文件位置(當然仍然需要追加)來檢查文件是否具有零長度。

當文件為空但仍然存在時,此方法還將為這種情況寫入標頭。 它還避免了需要import os來制作單獨的os.stat()來確定文件大小:

import random
import csv
from time import gmtime, strftime
    
headers = ['DATE', 'value']
v = random.randint(0, 100)
    
with open('collection1.dat', 'a', newline='') 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()僅在文件為空時才用於寫入標頭。


注意:如果 Python 2.x 仍在使用,您應該始終以二進制模式打開文件,例如ab ,如下所示:

with open('collection1.dat', 'ab') as f_output:

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

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

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

看起來您在我們發布答案時編輯了您的問題。 請添加任何更改作為編輯或提及您已更改的內容。 無論如何,雖然 dict 字段不同,但概念是相同的。

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)

集合1.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

如果您將Pandas DataFrame附加到一個 csv 文件,並且只想在第一次寫出時保留標題,這對我有用,比以前的解決方案簡單得多:

start = 100
with open('path_to_your_csv', "r",encoding = 'UTF-8') as myfile:
    reader = csv.DictReader(myfile)
    for i,line in itertools.islice(enumerate(reader) , start, 105): # iterate through row 100:105
    df # this is the data frame you want to export
    if i == start:
        df.iloc[0:0].to_csv(recent,sep = ",") # keep only header if this is the first you export
    df.to_csv(total,sep = ",",header =False)                                  
    del df

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM