0

我正在尝试遍历具有“主列表”名称的 CSV 文件,并将其与另一个仅包含在场并拨打电话的人的姓名的 CSV 文件进行比较。

我正在尝试遍历主列表并将其与另一个 CSV 文件中的名称进行比较,获取此人拨打的电话次数,并编写一个包含呼叫次数的新 CSV 文件(如果未找到该名称或如果它是 0,我需要该列在那里有 0。

我不确定它是否是我忽略的非常简单的事情,或者我是否真的错误地处理了这个问题。

编辑格式化。

import csv
import sys

masterlst = open('masterlist.csv')
comparelst = open(sys.argv[1])

masterrdr = csv.DictReader(masterlst, dialect='excel')
comparerdr = csv.DictReader(comparelst, dialect='excel')

headers = comparerdr.fieldnames

with open('callcounts.csv', 'w') as outfile:
    wrtr = csv.DictWriter(outfile, fieldnames=headers, dialect='excel', quoting=csv.QUOTE_MINIMAL, delimiter=',', escapechar='\n')
    wrtr.writerow(dict((fn,fn) for fn in headers))
    for lines in masterrdr:
        for row in comparerdr:
            if lines['Names'] == row['Names']:
                print(lines['Names'] + ' has ' + row['Calls'] + ' calls')
                wrtr.writerow(row)
            elif lines['Names'] != row['Names']:
                row['Calls'] = ('%s' % 0)
                wrtr.writerow(row)
                print(row['Names'] + ' had 0 calls')

masterlst.close()
comparelst.close()
4

2 回答 2

1

假设文件大小没有问题,我会这样做:

import csv
import sys

with open(sys.argv[1]) as comparelst:
    comparerdr = csv.DictReader(comparelst, dialect='excel')
    headers = comparerdr.fieldnames
    names_and_counts = {}
    for line in comparerdr:
        names_and_counts[line['Names']] = line['Calls']
        # or, if you're sure you only want the ones with 0 calls, just use a set and only add the line['Names'] values that that line['Calls'] == '0'


with open('masterlist.csv') as masterlst:
    masterrdr = csv.DictReader(masterlst, dialect='excel')
    with open('callcounts.csv', 'w') as outfile:
        wrtr = csv.DictWriter(outfile, fieldnames=headers, dialect='excel', quoting=csv.QUOTE_MINIMAL, delimiter=',', escapechar='\n')
        wrtr.writerow(dict((fn,fn) for fn in headers))
        # or if you're on 2.7, wrtr.writeheader()
        for line in masterrdr:
            if names_and_counts.get(line['Names']) == '0':
                 row = {'Names': line['Names'], 'Calls': '0'}
                 wrtr.writerow(row)

那只写了带有 0 个调用的行,这就是你的文本描述所说的 - 如果你想为非 0 调用写一些别的东西,你可以调整它。

于 2013-05-23T20:33:13.667 回答
0

感谢大家的帮助。我能够在我的外部循环内嵌套另一个 with 语句,并添加一个变量来测试主列表中的名称是否在比较列表中找到。这是我的最终工作代码。

import csv
import sys

masterlst = open('masterlist.csv')
comparelst = open(sys.argv[1])

masterrdr = csv.DictReader(masterlst, dialect='excel')
comparerdr = csv.DictReader(comparelst, dialect='excel')

headers = comparerdr.fieldnames

with open('callcounts.csv', 'w') as outfile:
    wrtr = csv.DictWriter(outfile, fieldnames=headers, dialect='excel', quoting=csv.QUOTE_MINIMAL, delimiter=',', escapechar='\n')
    wrtr.writerow(dict((fn,fn) for fn in headers))
    for line in masterrdr:
        found = False
        with open(sys.argv[1]) as loopfile:
            looprdr = csv.DictReader(loopfile, dialect='excel')
            for row in looprdr:
                if row['Names'] == line['Names']:
                    line['Calls'] = row['Calls']
                    wrtr.writerow(line)
                    found = True
                    break

        if found == False:
            line['Calls'] = '0'
            wrtr.writerow(line)

masterlst.close()
comparelst.close()
于 2013-05-28T12:32:22.047 回答