2013-08-05 3 views
-5

что у меня есть два DictКак проверить заголовок CSV файл

dict1 = {'name':'Leo','age':'15','tel':'123456789'} 
dict2 = {'name':'Zac','age':'20','tel':'987654321'} 

Я хочу, чтобы написать эти два dicts в файл CSV. Я могу написать dict в файл csv с заголовком, расположенным в верхней части таблицы, но когда я добавляю второй файл в тот же файл csv, он записывает другой заголовок после последних входов. Так что я хотел бы знать, если есть способ проверить, если заголовок уже существует, если нет, добавить заголовок, остальное просто добавить новые данные Dict

ответ

0

уверен

headers_that_do_not_exist = set(dict2.keys()) - set(dict1.keys()) 
+0

Я не знаю точно, что просит ОП, но это невозможно. У его двух диктонов есть точно такие же ключи, поэтому это всегда будет пустой набор. Плюс, он пытается написать 'dict2' в CSV-файл, поэтому писать только новые заголовки (если они есть) ничего полезного не сделают. – abarnert

+0

да, я предполагаю, что вы ближе к тому, что хотел OP ... Я не очень хорошо понял вопрос, я думаю ... –

+0

Я не уверен, что в этом есть достаточно, чтобы понять вопрос очень хорошо ... Я предполагаю, что он много нужно просить _something_ sensible, что имеет какое-то отношение к CSV-файлам и, вероятно, с 'DictWriter' ... но трудно получить дальше. – abarnert

2

Это не ясно, что ваш вопрос, поэтому я должен угадать. Если вы хотите получить более конкретный ответ, вместо неясных обобщений, вам нужно будет написать более конкретный вопрос.

Я подозреваю, что у вас есть код вроде этого:

with open('output.csv', 'w') as f: 
    dw = csv.DictWriter(f, ('name', 'age', 'tel')) 
    dw.writeheader() 
    dw.writerow(dict1) 

with open('output.csv', 'a') as f: 
    dw = csv.DictWriter(f, ('name', 'age', 'tel')) 
    dw.writeheader() 
    dw.writerow(dict2) 

И проблема в том, что ваш результат выглядит следующим образом:

name,age,tel 
Leo,15,123456789 
name,age,tel 
Zac,20,987654321 

Когда вы хотите это:

name,age,tel 
Leo,15,123456789 
Zac,20,987654321 

Если это так, правильный способ решить это - просто не звонить writeheader во второй раз. В зависимости от того, как структурирован ваш код, это может быть так просто, как просто не называть его где-то.

Но, допустим, у вас есть некоторые функции обертки, как это:

def add_to_csv(row): 
    with open('output.csv', 'a') as f: 
     dw = csv.DictWriter(f, ('name', 'age', 'tel')) 
     dw.writeheader() 
     dw.writerow(row) 

И вы не можете изменить его, и вы хотите, чтобы написать заголовок, только если файл пуст.

Существует несколько разных способов определить, является ли файл пустым. Один раз один раз, учитывая, что у вас открыт файл в 'a', нужно просто проверить, что f.tell() отличен от нуля. Или вы можете проверить, что os.fstat(f.fileno()).st_size отличное от нуля.

Но если вы делаете все записи в течение одного запуска программы, вероятно, более чистым является просто отслеживать внутри скрипта. Опять же, вы можете переместить код open и DictWriter на экземпляр/глобальный уровень вместо локального метода function /. Или вы можете добавить флаг instance/global, который отслеживает, вы еще звонили writeheader.

Смежные вопросы