python csv标头忽略,同时继续将数据追加到csv文件

rob*_*rob 4 python csv

我正在尝试将一些随机数据添加到文本文件中,但是我很成功,但是我遇到了标题行问题。我想一次添加标题行,然后每次运行脚本时,它应该只将数据添加到文件中,如果存在则忽略标题行。我尝试过类似的操作,但失败了。我尝试在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})
Run Code Online (Sandbox Code Playgroud)

它插入数据,但不添加任何标题行。我想在第一次运行脚本时包含标头,而下次运行脚本多次时,它应该仅添加数据,而不添加标头行。非常感谢您的任何想法或帮助。

Mar*_*ans 5

与其测试文件是否存在,您还可以通过查找到末尾并询问文件位置(当然仍然需要追加)来检查文件是否存在零长度。

当文件为空但仍然存在时,此方法还将为这种情况写入标头。它还避免了需要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})        
Run Code Online (Sandbox Code Playgroud)

writeheader() 然后仅在文件为空时才用于写入标头。


注意:如果 Python 2.x 仍在使用,您应该始终以二进制模式打开文件,例如ab

with open('collection1.dat', 'ab') as f_output:
Run Code Online (Sandbox Code Playgroud)


Bil*_*ell 5

对于Evans先生而言,一种更简单的替代方法是使用以下测试代替存在性测试:

fileEmpty = os.stat('collection1.dat').st_size == 0
Run Code Online (Sandbox Code Playgroud)

这消除了进行搜索等的需要。

编辑:完整代码:

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})
Run Code Online (Sandbox Code Playgroud)