【问题标题】:Python: add value and write outputPython:添加值并写入输出
【发布时间】:2015-12-04 23:28:55
【问题描述】:

我需要从列表中获取信息,并从名称中获取add a column year。我仍然不确定如何在记录中添加一个字段'year'我可以使用追加吗? 关于输出文件,我只需要使用outputcsv.writerow(records) 不是吗? 这是我卡住的部分代码:

filenames = ('babyQld2010.csv',     
    'babyQld2011.csv',
    'babyQld2012.csv', 
    'babyQld2012.csv',
    'babyQld2014.csv')

outFile = open('babyQldAll.csv','w') 
csvFile_out = csv.writer(outFile, delimiter=',')

for filename in filenames:
    name, ext = filename.split('.')
    year = name[-4:]     #extract year from  file names
    records = extract_names(filename)

    # Get (name, count, gender)  from  list "records", 
    # and add value of "year" and write into output file (using "for" loop )

输出文件如下:

2010,Lola,69,Girl

然后输入,我有 5 个文件 babyQld2010.csv, babyQld2011.csv, babyQld2012.csv, babyQld2012.csv, babyQld2014.csv,其中包含:

Mia,425,William,493

我必须按格式对其进行排序,我已经完成并保存在列表中'records'

Lola,69,Girl

现在我需要添加一个字段'year' on 'record'列表并导出csv file

这是我的完整代码:

import csv

def extract_names(filename):
    ''' Extract babyname, count, gender from a csv file,
    and return the data in a list.
    '''

    inFile = open(filename, 'rU')
    csvFile = csv.reader(inFile, delimiter=',')

    # Initialization
    records = []
    rowNum = 0

    for row in  csvFile:

        if rowNum != 0:

            # +++++ You code here ++++
            # Read each row of csv file and save information  in list 'records'
            # as (name, count, gender) 
            records.append([row[0], row[1], "Female"])
            records.append([row[2], row[3], "Male"])
            print('Process each row...')      

        rowNum += 1

    inFile.close()
    return(records)



#### Start main program  #####

filenames = ('babyQld2010.csv',     
    'babyQld2011.csv',
    'babyQld2012.csv', 
    'babyQld2012.csv',
    'babyQld2014.csv')

with open('babyQldAll.csv','w') as outFile:

    csvFile_out = csv.writer(outFile, delimiter=',')

    for filename in filenames:
        name, ext = filename.split('.')
        year = name.split('.')[0][-4:]     #extract year from  file names
        records = extract_names(filename)
        for record in records:
            csvFile_out.write([year] + record)
    print("Write in csv file...")     

outFile.close()

【问题讨论】:

标签: python csv for-loop


【解决方案1】:

要从 csv 文件中获取年份,您可以简单地将字符串拆分为 '.',然后从拆分的第一部分获取最后四个字符。示例 -

>>> s = 'babyQld2010.csv'
>>> s.split('.')[0][-4:]
'2010'

然后只需简单地遍历您说是正确的记录列表,对于 in 中的每个列表,使用列表连接创建一个以年份开头的新列表并将其写入 csv 文件。

我还建议您使用 with 语句打开要写入的文件(甚至在您从其他 csv 文件读取的函数中)。示例 -

filenames = ('babyQld2010.csv',     
    'babyQld2011.csv',
    'babyQld2012.csv', 
    'babyQld2012.csv',
    'babyQld2014.csv')

with open('babyQldAll.csv','w') as outFile:

    csvFile_out = csv.writer(outFile, delimiter=',')

    for filename in filenames:
        name, ext = filename.split('.')
        year = name.split('.')[0][-4:]     #extract year from  file names
        records = extract_names(filename)
        for record in records:
            csvFile_out.writerow([year] + record)

【讨论】:

  • 第 62 行,open('babyQldAll.csv','w') as outFile: ^ SyntaxError: invalid syntax 它显示的那样
  • 也许您错过了关闭该行上方的一些括号?你能显示完整的代码吗?在问题中。
  • 对不起,我刚下班回来。我刚刚更新了它@AnandSKumar
  • 我无法重现无效的语法错误,您确定这是行和完整的堆栈跟踪吗?如果是这样,您能否使用完整的回溯更新问题?
  • 我运行并显示: Traceback(最近一次调用最后一次):文件“E:\SIT111\A1\data\writeCSVTPL.py”,第 71 行,在 csvFile_out.write([年] + 记录) AttributeError: '_csv.writer' 对象没有属性 'write'
【解决方案2】:

是的,您可以在从源文件中读取时将year 列附加到每一行。您可以将每一行作为字典读入和写出,以便在需要对其进行处理时使用现有的列标题来处理数据。

使用csv.DictWriter() 方法,您可以在设置时指定标题(fieldnames)。然后,您可以使用writeheader() 方法将它们写出来。

import csv
file_list = ['babyQld2010.csv',     
             'babyQld2011.csv',
             'babyQld2012.csv', 
             'babyQld2012.csv',
             'babyQld2014.csv']
outFile = open('babyQldAll.csv', 'wb')
csv_writer = csv.DictWriter(outFile, 
                            fieldnames=['name','count','gender','year'])
csv_write_out.writeheader()

for a_file in file_list:
    name,ext = a_file.split('.')
    year = name[-4:]
    with open(a_file, 'rb') as inFile:
        csv_read_in = csv.DictReader(inFile)
        for row in csv_read_in:
            row['year'] = year
            csv_writer.writerow(row)

outfile.close()

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多