繁体   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