2017-02-20 52 views
0

我需要8所列出的内容导出到CSV文件(谷歌加州出口)的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

将你的问题分解成更小的问题。如果你没有字典,为什么使用'csv.Dictwriter()'?或者,如果您因某种原因想要使用“Dictwriter”,只需专注于创建字典即可。通过在彼此之上堆叠错误来使你的生活变得复杂。 –

+0

事情是,我不知道如何写没有字典的行,DictWriter.writerow需要一个字典;我正在寻找一种方法,将每个字段的值直接传递给编写器函数 顺便说一下,在我的程序中似乎很难制作单个字典,因为我需要具有多个类的日期(键)的多个值 – 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=',') 

我不知道你是否想名为“假”,或者列一列,所以我做了后者只有假值。我也不确定额外的'datefield'列是否是故意的 - 据我所知,没有两列可以出现在数据框中。

+0

Thank you for this解决方案,尽管它引发了以下例外: 'Traceback(最近调用最后一次): 文件“/usr/local/lib/python3.6/site-packages/pandas/core/common.py”,第389行,在_asarray_tuplesafe 结果[:] =值 ValueError:无法从形状(87,1)广播输入数组到形状(87)' – Pitynet

+0

我设法以另一种方式做到这一点,我会在下面张贴它 – Pitynet

相关问题