2013-05-28 1 views
2

Я использую python 2.4 и пытаюсь экспортировать значение последней команды unix в файл csv. Я не могу понять, как заставить его фактически писать каждую строку в файл csv, любая помощь будет оценена!python write dictreader to csv file

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) 

ответ

4

Вам нужно либо использовать csv.DictWriter() вместо (с соответствующими именами полей) или включить словарь строки в последовательность:

writer.row([value for key, value in sorted(row.items())]) 

будет выводить значения отсортированных по ключу, например.

Использование DictWriter может быть столь же просто, как:

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

, который написал бы точно такие же поля, в том же порядке, как и то, что ожидает ваш DictReader() класс.

+0

Вам также необходимо написать заголовок явно как: writer.writeheader() , иначе заголовок не будет записан. – Bolaka

+0

@Bolaka: да, но не каждый usecase требует строки заголовка. OP использовал явный аргумент 'fieldnames' для' DictReader' здесь, что означает, что во входном файле нет строки заголовка. –

+0

true, не каждый usecase требует строку заголовка. Его просто так: writer = csv.DictWriter (open ('dict.csv', 'wb'), fieldnames = reader.fieldnames) - создало впечатление, что он также напишет заголовок. Поэтому я думаю, что в ответе следует упомянуть, что если кто-то хочет написать заголовок, add-writer.writeheader() – Bolaka