我可以在脚本中使用以下几行使用python将标头写入csv文件:
with open(output_file, mode='w+') as csv_file:
csv_file = open(output_file, mode='w+')
title_writer = csv.writer(csv_file, delimiter=',', lineterminator='\n')
title_writer.writerow(["AWS Instance List " + today])
fieldnames = ['Name', 'Instance ID', 'Type', 'State', 'Private IP', 'Public IP', 'Region', 'Availability Zone', 'Launch Time', 'AWS Account', 'Account Number']
writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=',', lineterminator='\n')
writer.writeheader()
但是稍后我要在脚本的第139行中追加到该文件时:
with open(output_file,'a') as fd:
fd.writerow({'Name': name, 'Instance ID': instance["InstanceId"], 'Type': instance["InstanceType"], 'State': instance["State"]["Name"], 'Private IP': private_ips_list, 'Public IP': public_ips_list, 'Region': region['RegionName'], 'Availability Zone': instance['Placement']['AvailabilityZone'], 'Launch Time': launch_time_friendly, 'AWS Account': aws_account, "Account Number": aws_account_number})
我收到此错误:
Traceback (most recent call last):
File ".\aws_ec2_list_instances.py", line 254, in <module>
main()
File ".\aws_ec2_list_instances.py", line 247, in main
loop_regions(aws_account,aws_account_number)
File ".\aws_ec2_list_instances.py", line 139, in loop_regions
fd.writerow({'Name': name, 'Instance ID': instance["InstanceId"], 'Type': instance["InstanceType"], 'State': instance["State"]["Name"], 'Private IP': private_ips_list, 'Public IP': public_ips_list, 'Region': region['RegionName'], 'Availability Zone': instance['Placement']['AvailabilityZone'], 'Launch Time': launch_time_friendly, 'AWS Account': aws_account, "Account Number": aws_account_number})
AttributeError: '_io.TextIOWrapper' object has no attribute 'writerow'
错误在第139行。其他两个行号只是函数调用。
为什么会这样?如何附加到此文件?
答案 0 :(得分:1)
您创建了一个纯文件对象
您需要像之前
一样通过writer = csv.DictWriter(fd,...)
重新创建CSV编写器
然后您可以再次使用写行功能
或者,在打开文件之前预先收集所需的所有数据,然后使用已经拥有的同一writer对象(并打开文件)
使用伪代码
# get data
# open file
# open writer
# write headers
# for each row in data
# write data row
注意:您在这里两次打开相同的文件。您应该删除第二行
with open(output_file, mode='w+') as csv_file:
csv_file = open(output_file, mode='w+')
答案 1 :(得分:0)
您需要打开一个文件对象,然后将其传递给csv.writer
,您已经重复了不需要的语句csv_file = open(output_file, mode='w+')
。
with open(output_file, mode='w+') as csv_file:
#You already did it, no need to repeat this statement
#csv_file = open(output_file, mode='w+')
title_writer = csv.writer(csv_file, delimiter=',', lineterminator='\n')
title_writer.writerow(["AWS Instance List " + today])
fieldnames = ['Name', 'Instance ID', 'Type', 'State', 'Private IP', 'Public IP', 'Region', 'Availability Zone', 'Launch Time', 'AWS Account', 'Account Number']
writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=',', lineterminator='\n')
writer.writeheader()