无法将列表写回CSV

时间:2014-07-21 04:27:04

标签: python csv

我正在尝试编写一个接受csv的代码,对第一列中的值运行ping,然后将状态输出到第二列。代码中的所有内容都运行正常,直到它尝试写出csv,此时我收到此错误   第35行,在writer.writerows(列)中 TypeError:'str'不支持缓冲区接口

import os
import csv
from collections import defaultdict
i = 0
#read file
columns = defaultdict(list)

with open('hosts.csv') as f:
    reader = csv.DictReader(f)
    for row in reader:
        for (k,v) in row.items():
            columns[k].append(v)
f.close()
print('[DEBUG]', columns['host'])
print('[DEBUG] 1st host is', (columns['host'])[0])
print('[DEBUG]', columns['status'])

#ping hosts
hostname = (columns['host'])[i]
response = os.system("ping -n 1 " + hostname)
print ("[DEBUG]", response)
if response == 0:
    print (hostname, 'is up')
    (columns['status'])[i] = 'Up'
    i = i+1
else:
    print (hostname, 'is down')
    (columns['status'])[i] = 'Down'
    i = i+1

#write results
with open("hosts.csv", "wb") as f:
    writer =csv.writer(f)
    print("[DEBUG] just before write rows")
    writer.writerows(columns)
    print("[DEBUG] after write rows")
f.close()

csv包含以下内容

host,status,name
8.8.8.8,down,google.com

并且应该返回

host,status,name
8.8.8.8,Up,google.com

我正在使用Python 3.4

1 个答案:

答案 0 :(得分:0)

您正在以一种格式阅读CSV并在另一种格式中写入,其中列是defaultdict,其中包含dict中的值列表。

这是解决此问题的更好方法,维护原始文件结构:

import os
import csv

with open('hosts.csv') as f:
    reader = csv.DictReader(f)
    rows = list(reader)

hosts = [row['host'] for row in rows]
statuses = [row['status'] for row in rows]

print('[DEBUG]', hosts)
print('[DEBUG] 1st host is', hosts[0])
print('[DEBUG]', statuses)

for row in rows:
    #ping hosts
    hostname = row['host']
    response = os.system("ping -n 1 " + hostname)
    print ("[DEBUG]", response)
    if response == 0:
        print (hostname, 'is up')
        row['status'] = 'Up'
    else:
        print (hostname, 'is down')
        row['status'] = 'Down'

#write results
with open("hosts.csv", "wb") as f:
    writer = csv.DictWriter(f, reader.fieldnames)
    # to maintain the same structure from the original file, rewrite header in original position
    writer.writeheader()
    print("[DEBUG] just before write rows")
    writer.writerows(rows)
    print("[DEBUG] after write rows")

在实例化csv.DictWriter之前,您可以更改要在新文件中的字段名称:

newfieldnames = csvreader.fieldnames
lastfield = newfieldnames.pop() # remove last field
if 'field_name' in newfieldnames:
    newfieldnames.remove('field_name') # remove by field name
writer = csv.DictWriter(f, newfieldnames)