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)
我需要将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)