【问题标题】:Python: aggregate not unique value lists into a dictionary for csv outputPython:将非唯一值列表聚合到字典中以进行 csv 输出
【发布时间】:2017-02-20 10:01:29
【问题描述】:

我需要将 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。它对数据分析、数据操作很有用,它支持excel csv txt输出。
  • 把你的问题分解成更小的问题。如果你没有字典,为什么要使用csv.Dictwriter()?或者,如果您出于某种原因确实想使用Dictwriter,只需专注于创建字典即可。将错误叠加在一起,让您的生活变得复杂。
  • 问题是,我不知道如何在没有字典的情况下编写行,DictWriter.writerow 需要字典;我正在寻找一种将每个字段的值直接传递给 writerow 函数的方法顺便说一句,在我的程序中创建一个字典似乎很困难,因为我需要具有多个类的日期(键)的多个值

标签: python list python-3.x dictionary export-to-csv


【解决方案1】:

这在名为 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 值的列,所以我选择了后者。我也不确定额外的“日期字段”列是否是故意的 - 据我所知,数据框中没有两列。

【讨论】:

  • 感谢您提供此解决方案,尽管它引发了以下异常:Traceback (most recent call last): File "/usr/local/lib/python3.6/site-packages/pandas/core/common.py", line 389, in _asarray_tuplesafe result[:] = values ValueError: could not broadcast input array from shape (87,1) into shape (87)
【解决方案2】:

我找到了一个使用 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多