对象没有附加到文件python的属性'writerow'

时间:2019-04-30 14:59:43

标签: python

我可以在脚本中使用以下几行使用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行。其他两个行号只是函数调用。

为什么会这样?如何附加到此文件?

2 个答案:

答案 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()