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