Python:将非唯一值列表聚合到字典中以用于 csv 输出

Python: aggregate not unique value lists into a dictionary for csv output

我需要将8个列表的内容导出到一个csv文件(Google Cal导出)

# 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 输出(对于日期字段中的每个日期):

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])

这在名为 pandas 的库中非常简单。

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' 的列还是只有 False 值的列,所以我选择了后者。我也不确定额外的 'datefield' 列是否是故意的 - 据我所知,数据框中没有两列可以存在。

我找到了一个使用 pandas 的解决方案(我没能使最新的答案生效):

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)