2017-02-20 34 views
0

Мне нужно экспортировать содержимое из 8 списков в файл CSV (экспорт Google Cal)Python: агрегировать не уникальные списки значений в словарь для вывода CSV

# Class dates (there can be the same value for several iterations) 
datefield = [] 

# All fields are linked to a date (same index) 
starttimefield = [] 
endtimefield = [] 
subjectfield = [] 
typefield = [] 
teacherfield = [] 
groupfield = [] 
roomfield = [] 

То, что я ищу, такой вывод CSV на каждой строке (для каждой даты в DateField):

subjectfield,datefield,starttimefield,datefield,endtimefield,FALSE,typefield,roomfield 

до сих пор, я попробовал это (как-то он не хочет писать, если используется режим 'wb'):

rows = subjectfield,datefield,starttimefield,datefield,endtimefield,FALSE,typefield,roomfield 
zip(*rows) 

with open('classes.csv', 'w') as csvfile: 
    writer = csv.DictWriter(
     csvfile, fieldnames=['Subject', 'Start Date', 'Start Time', 'End Date', 'End Time', 'All Day Event', 'Description', 'Location', 'Private'] 
    ) 
    writer.writeheader() 
    for row in rows: 
     writer.writerow(row) 

Проблема заключается в том, что я получаю CSV-файл, как это (по одной строке для каждого значения списка):

subjectfield[0] 
subjectfield[1] 
subjectfield[...] 
datefield[0] 
datefield[1] 
... 

Я понимаю, что csv.DictWriter() writerow принимать только словари, и я понятия не имею, как это сделать. объединить списки в словарь так, как мне это нужно; datefield может содержать одно и то же значение несколько раз, так как в тот же день могут быть несколько классов.

Поэтому то, что я искал бы что-то вроде этого:

with open('classes.csv', 'w') as csvfile: 
    writer = csv.DictWriter(
     csvfile, fieldnames=['Subject', 'Start Date', 'Start Time', 'End Date', 'End Time', 'All Day Event', 'Description', 'Location', 'Private'] 
    ) 
    writer.writeheader() 
    for i in range(len(datefield)): 
     writer.writerow(subjectfield[i], datefield[i], starttimefield[i], datefield[i], endtimefield[i], "FALSE", typefield[i], roomfield[i]) 
+0

чека из [панд] (http://pandas.pydata.org/). Это полезно для анализа данных, обработки данных и поддерживает вывод excel csv txt. –

+0

сломать вам проблемы на более мелкие. Если у вас нет dict, зачем использовать 'csv.Dictwriter()'? Или, если вы действительно хотите использовать 'Dictwriter', по какой-то причине просто сосредоточитесь на создании dict для начала. Вы делаете вашу жизнь сложной, укладывая ошибки друг на друга. –

+0

Дело в том, что я не знаю, как писать строки без словарей, DictWriter.writerow требует словаря; Я ищу способ передать непосредственно значения для каждого поля в функцию writow Btw, кажется, сложно сделать какой-либо словарь в моей программе, потому что мне нужны кратные значения для дат (ключей), которые имеют несколько классов – Pitynet

ответ

0

Я нашел решение, используя панда (я не успел сделать последнюю работу ответа):

raw_data = {'Subject': subjectfield, 
      'Start Date': datefield, 
      'Start Time': starttimefield, 
      'End Date': datefield, 
      'End Time': endtimefield, 
      'All Day Event': 'False', 
      'Description': '', 
      'Location': roomfield} 

df = pd.DataFrame(raw_data, columns=['Subject', 'Start Date', 'Start Time', 'End Date', 'End Time', 'All Day Event', 
            'Description', 'Location']) 
df.to_csv("classes_schedule.csv", sep=",", encoding='utf-8', index=False) 
0

это довольно прямо вперед в библиотеке под названием панд.

from pandas import DataFrame 
write_data = DataFrame([]) 

# DataFrame.insert(#position,'ColumnName',Value) 
write_data.insert(0,'subjectfield',pd.DataFrame(subjectfield)) 
write_data.insert(1,'datefield',pd.DataFrame(datefield)) 
write_data.insert(2,'starttimefield',pd.DataFrame(starttimefield)) 
write_data.insert(3,'endtimefield',pd.DataFrame(endtimefield)) 
write_data.insert(4,'boolean',False) 
write_data.insert(5,'typefield',pd.DataFrame(typefield)) 
write_data.insert(6,'roomfield',pd.DataFrame(roomfield)) 

#DataFrame.to_csv('File_name',sep='SEPERATOR') 
write_data.to_csv('my_file.csv',sep=',') 

Я не уверен, хочет ли вы столбец с именем «FALSE» или столбце, чтобы иметь только ложные значения, так что я сделал последний. Я также не уверен, что дополнительный столбец «datefield» был преднамеренным - ни два столбца, насколько я понимаю, не могут присутствовать в фрейме данных.

+0

Спасибо за это хотя это вызвало следующее исключение: «Traceback (последний последний звонок): Файл« /usr/local/lib/python3.6/site-packages/pandas/core/common.py », строка 389, in_asarray_tuplesafe результат [:] = значения ValueError: не удалось передать входной массив из формы (87,1) в форму (87) ' – Pitynet

+0

Мне удалось сделать это по-другому, я отправлю его ниже – Pitynet

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

  • Нет связанных вопросов^_^