python csv,只写一次头文件

cyb*_*mon 15 python csv

所以我有一个程序从.Json创建CSV.

首先我加载json文件.

f = open('Data.json')
data = json.load(f)
f.close()
Run Code Online (Sandbox Code Playgroud)

然后,如果我找到该关键字,我会查找特定的关键字.我将在.csv文件中编写与之相关的所有内容.

for item in data:
    if "light" in item:
       write_light_csv('light.csv', item)
Run Code Online (Sandbox Code Playgroud)

这是我的write_light_csv功能:

def write_light_csv(filename,dic):

    with open (filename,'a') as csvfile:
        headers = ['TimeStamp', 'light','Proximity']
        writer = csv.DictWriter(csvfile, delimiter=',', lineterminator='\n',fieldnames=headers)

        writer.writeheader()

        writer.writerow({'TimeStamp': dic['ts'], 'light' : dic['light'],'Proximity' : dic['prox']})
Run Code Online (Sandbox Code Playgroud)

我最初有wb+模式,但每次打开文件写入时都清除了所有内容.我用它替换了它,a现在每次写入时,它都会添加一个标题.如何确保标题只写一次?

Igo*_*ist 27

您可以检查文件是否已存在,然后不要调用,writeheader()因为您打开了带有附加选项的文件.

像这样的东西:

import os.path


file_exists = os.path.isfile(filename)

with open (filename, 'a') as csvfile:
    headers = ['TimeStamp', 'light', 'Proximity']
    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({'TimeStamp': dic['ts'], 'light': dic['light'], 'Proximity': dic['prox']})
Run Code Online (Sandbox Code Playgroud)


Gil*_*ert 10

您可以检查文件是否为空

import csv
import os

headers = ['head1', 'head2']

for row in interator:
    with open('file.csv', 'a') as f:
        file_is_empty = os.stat('file.csv').st_size == 0
        writer = csv.writer(f, lineterminator='\n')
        if file_is_empty:
            writer.writerow(headers)
        writer.writerow(row)
Run Code Online (Sandbox Code Playgroud)


Dev*_*cie 10

只是另一种方式:

with open(file_path, 'a') as file:
        w = csv.DictWriter(file, my_dict.keys())

        if file.tell() == 0:
            w.writeheader()

        w.writerow(my_dict)
Run Code Online (Sandbox Code Playgroud)