python csv fieldnames错误

时间:2017-05-15 14:56:36

标签: python excel csv

我正在做一些导出到csv,我的字段名有问题。 我想要3行“fieldnames”

Row 1 : Field 1:empty    ; Field 2:"YEAR" , Field3:"2017"
Row 2 : Field 1:empty    ; Field 2:"MONTH", Field3: month.number
Row 3 : Field 1:"STATION"; Field 2:"CODE" , Field3: day.number

由于我不知道如何联合细胞,因此2017年将所有细胞合并到12/365细胞之上,或者每个月(例如Jan)将31个细胞合并在一起。我用2017年或1月打印每个单元格(31次) 2月(28次)等。

import csv
import calendar
from datetime import datetime

HYear= [' ','Year','2017']
HMonth=[' ','Month','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug',
       'Sep','Oct','Nov','Dec']
HDay=  ['Station','Code','01','02','03','04','05','06','07',
      '08','09','10','11','12','13','14','15','16','17','18',
      '19','20','21','22','23','24','25','26','27','28','29','30','31']

#VARs
today = datetime.today()
num_day = today.day
num_month = today.month

mon1 = calendar.monthrange(2017, 1)[1] ###31
mon2 = calendar.monthrange(2017, 2)[1]+mon1###59
mon3 = calendar.monthrange(2017, 3)[1]+mon2###90
mon4 = calendar.monthrange(2017, 4)[1]+mon3
mon5 = calendar.monthrange(2017, 5)[1]+mon4
mon6 = calendar.monthrange(2017, 6)[1]+mon5
mon7 = calendar.monthrange(2017, 7)[1]+mon6
mon8 = calendar.monthrange(2017, 8)[1]+mon7
mon9 = calendar.monthrange(2017, 9)[1]+mon8
mon10= calendar.monthrange(2017,10)[1]+mon9
mon11= calendar.monthrange(2017,11)[1]+mon10
mon12= calendar.monthrange(2017,12)[1]+mon11

#Days in Year
for i in range(1,num_month):
  d = calendar.monthrange(2017, i)[1]
  num_day+=sum((0, d))
days_year = num_day###135 or so

#to CSV
def csv_dict_writer(path, fieldnames, data):
  with open(path, "wb") as out_file:
    writer = csv.DictWriter(out_file, delimiter=',', fieldnames=fieldnames)
    writer.writeheader()

    for row in data:
      writer.writerow(row)

#####Headers
heady="%s,%s"%(HYear[0],HYear[1])
headm="%s,%s"%(HMonth[0],HMonth[1])
headd="%s,%s"%(HDay[0],HDay[1])

#####Adding more content to the headers
for i in range(2,days_year+2):###2-367
  if i>1:
    heady+=",%s"%HYear[2]
  if i in range(2,mon1+2):###2-33
    headm+=",%s"%HMonth[2]
    headd+=",%s"%HDay[i]
  elif i in range(mon1+2,mon2+2):###33-61
    headm+=",%s"%HMonth[3]
    headd+=",%s"%HDay[i-mon1]
  elif i in range(mon2 +2,mon3 +2):
    headm+=",%s"%HMonth[4]
    headd+=",%s"%HDay[i-mon2]
  elif i in range(mon3 +2,mon4 +2):
    headm+=",%s"%HMonth[5]
    headd+=",%s"%HDay[i-mon3]
  elif i in range(mon4 +2,mon5 +2):
    headm+=",%s"%HMonth[6]
    headd+=",%s"%HDay[i-mon4]
  elif i in range(mon5 +2,mon6 +2):
    headm+=",%s"%HMonth[7]
    headd+=",%s"%HDay[i-mon5]
  elif i in range(mon6 +2,mon7 +2):
    headm+=",%s"%HMonth[8]
    headd+=",%s"%HDay[i-mon6]
  elif i in range(mon7 +2,mon8 +2):
    headm+=",%s"%HMonth[9]
    headd+=",%s"%HDay[i-mon7]
  elif i in range(mon8 +2,mon9 +2):
    headm+=",%s"%HMonth[10]
    headd+=",%s"%HDay[i-mon8]
  elif i in range(mon9 +2,mon10+2):
    headm+=",%s"%HMonth[11]
    headd+=",%s"%HDay[i-mon9]
  elif i in range(mon10+2,mon11+2):
    headm+=",%s"%HMonth[12]
    headd+=",%s"%HDay[i-mon10]
  elif i in range(mon10+2,mon12+2):
    headm+=",%s"%HMonth[13]
    headd+=",%s"%HDay[i-mon11]

print heady
print headm
print headd

###Creating CSV
if __name__ == "__main__":
  data=[heady.split(","),
        headm.split(","),
        headd.split(",")]
  my_list = []
  fieldnames = data[0]
  for values in data[1:]:
      inner_dict = dict(zip(fieldnames, values))
      my_list.append(inner_dict)
  path = "dict_output.csv"
  csv_dict_writer(path, fieldnames, my_list)

在运行程序之后我得到的变量令人头疼,headm和headd是:(打印每个)

#Print Header Year
 ,Year,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017

#Print Header Month
 ,Month,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Feb,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Mar,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,Apr,May,May,May,May,May,May,May,May,May,May,May,May,May,May,May

#Print Header Day
Station,Code,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15

但是,我在csv中得到的标题是:

Row 1: empty, Year, 2017, 2017 ... (correct)
Row 2: Empty, Month, May, May ... (should be Jan not May)
Row 3-360+: Station, Code, 15, 15 ... (should be 01, 02, ..,31, 01, 02... and so on)

有什么建议吗? 提前谢谢!

PS:输出就像

empty,   YEAR, 2017, 2017, 2017....*365
empty,  MONTH, Jan, Jan, Jan...*31, Feb, Feb...*28.....
STATION, CODE, 01, 02, 03..., 31, 01, 02,...,28, 01.....

1 个答案:

答案 0 :(得分:1)

修改csv writer方法和main以获取列表并将其写入您的文件!

#to CSV
def csv_writer(path, data):
  with open(path, "wb") as out_file:
    for row in data:
      out_file.write(','.join(row))
      out_file.write('\n')


###Creating CSV
if __name__ == "__main__":
  data=[heady.split(","),
        headm.split(","),
        headd.split(",")]
  #data = zip(*data)
  print data
  path = "dict_output.csv"
  csv_writer(path, data)

示例输出:

,Year,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,..
 ,Month,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,Jan,..
Station,Code,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,..