Python csv, запись заголовков только один раз

Итак, у меня есть программа, которая создает CSV из .Json.

Сначала загружаю json файл.

f = open('Data.json')
data = json.load(f)
f.close()

Затем я просматриваю это, ища конкретное ключевое слово, если найду это ключевое слово. Я напишу все, что связано с файлом .csv.

for item in data:
    if "light" in item:
       write_light_csv('light.csv', item)

Это моя функция 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']})

У меня первоначально был wb+ как режим, но он очищал все каждый раз, когда файл был открыт для записи. Я заменил его на a и теперь каждый раз, когда он пишет, он добавляет заголовок. Как я могу убедиться, что заголовок написан только один раз?.

Ответ 1

Вы можете проверить, существует ли файл, а затем не вызывать 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']})

Ответ 2

Вы можете проверить, если файл пуст

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)

Ответ 3

Просто еще один способ:

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

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

        w.writerow(my_dict)

Ответ 4

Можете ли вы изменить структуру своего кода и сразу экспортировать весь файл?

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

        writer.writeheader()

        for item in data:
            if "light" in item:
                writer.writerow({'TimeStamp': item['ts'], 'light' : item['light'],'Proximity' : item['prox']})


write_light_csv('light.csv', data)

Ответ 5

Я бы использовал несколько flag и запустил чек перед тем, как писать headers! например.

flag=0
def get_data(lst):
    for i in lst:#say list of url
        global flag
        respons = requests.get(i)
        respons= respons.content.encode('utf-8')
        respons=respons.replace('\\','')
        print respons
        data = json.loads(respons)
        fl = codecs.open(r"C:\Users\TEST\Desktop\data1.txt",'ab',encoding='utf-8')
        writer = csv.DictWriter(fl,data.keys())
        if flag==0:
            writer.writeheader()
        writer.writerow(data)
        flag+=1
        print "You have written % times"%(str(flag))
    fl.close()
get_data(urls)

Ответ 6

Вы можете использовать класс csv.Sniffer и

with open('my.csv', newline='') as csvfile:
    if csv.Sniffer().has_header(csvfile.read(1024))
    # skip writing headers