【问题标题】:Manipulating multiple CSV files in python在 python 中操作多个 CSV 文件
【发布时间】:2015-05-20 06:21:09
【问题描述】:

我正在尝试从几个不同的 csv 文件中提取数据并将其插入到 1 个 CSV 文件中,但我无法为每个字段创建一个具有特定名称的列表(记录)。

原始文件格式: [女孩名,女孩名数,男孩名,男孩名数]

输出: [姓名、人数、性别]

我目前的代码是:

import csv

def extract_names(filename):

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

    # Initialization
    records = []
    rowNum = 0

    for row in  csvFile:

        if rowNum != 0:

            # Read each row of csv file and save information  in list 'records'
            # as (name, count, gender) 
            records.append(name, count, gender)


            print('Process each row...')      

        rowNum += 1

    inFile.close()
    return(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 )

    print("Write in csv file...")     

outFile.close()

【问题讨论】:

  • 相同的姓名/性别组合是否会出现在多个文件中,如果发生这种情况,您想添加计数吗?
  • 是的,它出现在所有初始文件中,无需考虑重复项(如果这就是您的要求)
  • 您似乎跳过了第一行。第一行是标题吗?你试过 csv.ReadDict 吗?
  • 第一行不需要,因为在原始文件中它是:[女孩姓名,女孩姓名计数,男孩姓名,男孩姓名计数],当我(未来)写入另一个 csv i希望他们是:[姓名、人数、性别]
  • 如果您的目标也是 csv,那么您可以将记录中的数据附加为一行以逗号分隔的名称、计数和性别值作为 records.append(name+','+count+' ,'+性别)

标签: python csv


【解决方案1】:

假设您的第一个 csv 在其第一行中有列名:

import csv

res = []
infile = open(filename, "r")
oufile = open(oufilename, "w")
inf = csv.reader(infile)
inf.next()
ouf = csv.writer(oufile)
ouf.writerow(["name", "count", "gender"])
for row in inf:
    res.append([row[0], row[1], "F"])
    res.append([row[2], row[3], "M"])
ouf.writerows(res)
infile.close()
oufile.close()

【讨论】:

  • 女孩名字的女孩名字的数量男孩的名字男孩名字的数量苏菲 389 Cooper 475 那是 1 行,包括不需要的标题
  • 这给出了错误“列表索引必须是整数,而不是 str”??
【解决方案2】:

这会奏效。你仍然应该在所有 csv 文件上建立一个循环,建立一个安全机制,以防你有一个 csv 文件的女孩和男孩名字数量不等,并且可能修剪一些空格。

import csv
def read_gender_counts():
    sample_csv = 'GirlName, GirlCount, BoyName, BoyCount\nAnna, 4, John, 6\nMary, 5, Fred, 10'
    csvFile = csv.reader(sample_csv.split('\n'), delimiter=',')

    records = list()
    for i, row in enumerate(csvFile):
        if i > 0:
            records.append((row[0], row[1], 'F'))
            records.append((row[2], row[3], 'M'))

    print (records)

有输出:

[('Anna', ' 4', 'F'), 
 (' John', ' 6', 'M'), 
 ('Mary', ' 5', 'F'), 
 (' Fred', ' 10', 'M')]

【讨论】:

    【解决方案3】:

    使用 DictReader:

    [burhan@dev t]$ cat sample.csv
    girl name, count of girl names, boy name, count of boynames
    Laura,1,John,2
    Sarah,3,Frank,5
    [burhan@dev t]$ python
    >>> import csv
    >>> with open('sample.csv') as f:
    ...   reader = csv.DictReader(f)
    ...   rows = list(reader)
    ...
    >>> rows[0]['girl name']
    'Laura'
    >>> rows
    [{' count of girl names': '1', ' count of boynames': '2', ' boy name': 'John', 'girl name': 'Laura'}, {' count of girl names': '3', ' count of boynames': '5', ' boy name': 'Frank', 'girl name': 'Sarah'}]
    

    正如你所说,你不能使用 DictReader,试试这个版本:

    import csv
    
    results = list()
    
    with open('file.csv') as f:
       reader = csv.reader(f, delimiter=',')
       header = next(reader) # Saves the first line and skips it
       for row in reader:
          results.append(dict(zip(header,row)))
    
    print(results)
    

    【讨论】:

    • EDIT## 我不能使用字典阅读器,我有什么应该使用的
    • 不使用“with open(..)”是否可以做到??
    • 当然可以,但你必须自己弄清楚。
    猜你喜欢
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2014-04-12
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    相关资源
    最近更新 更多