python将dictreader写入csv文件

python将dictreader写入csv文件,python,csv,python-2.4,Python,Csv,Python 2.4,我正在使用Python2.4,并尝试将unix last命令的值导出到csv文件中。我不知道如何让它真正把每一行写入csv文件,任何帮助都将不胜感激 import csv def check(user,logfile,name): logfile.write('********' + name + '*********\n') g = subprocess.Popen(["last",user], stdout=subprocess.PIPE) stdout, stde

我正在使用Python2.4,并尝试将unix last命令的值导出到csv文件中。我不知道如何让它真正把每一行写入csv文件,任何帮助都将不胜感激

import csv

def check(user,logfile,name):
    logfile.write('********' + name + '*********\n')
    g = subprocess.Popen(["last",user], stdout=subprocess.PIPE)
    stdout, stderr = g.communicate()
    reader = csv.DictReader(stdout.splitlines(),
                            delimiter=' ', skipinitialspace=True,
                            fieldnames=['id', 'pts', 'cpu',
                                        'day', 'month', 'date',
                                        'time', 'dash', 'off',
                                        'loggedin', 'test1', 'test2'])

    writer = csv.writer(open('dict.csv','wb'))
    for row in reader:
        writer.writerow(row)

您需要改用
csv.DictWriter()
(使用匹配的字段名),或者将字典行转换为序列:

writer.row([value for key, value in sorted(row.items())])
例如,将输出按键排序的值

使用
DictWriter
可以非常简单:

writer = csv.DictWriter(open('dict.csv','wb'), fieldnames=reader.fieldnames)

它将按照您的
DictReader()
类所期望的顺序写入完全相同的字段。

您还需要将标题显式地写为:writer.writeheader(),否则不会写入标题。@Bolaka:是的,但并非每个用例都需要标题行。OP在这里使用了一个显式的
fieldnames
参数来
DictReader
,这意味着输入文件上也没有头行。如果是,并非每个用例都需要头行。只是-writer=csv.DictWriter(open('dict.csv','wb'),fieldnames=reader.fieldnames)给我的印象是它也会写出标题。因此,我认为答案应该提到,如果确实有人想要编写标题,请添加-writer.writeheader()