0

我有两个文本文件。一个有大约 100 行 (A),另一个可能有大约 800 行 (B)。

我希望从 A 中读取一行,然后从 B 中读取所有行,然后打印一行,其中包含每个文件中的值。

我正在使用 python 的 csv 模块,因为我知道这些文件格式和内容,它们都是逗号分隔的值。

我的代码看起来像这样......

import csv

infile1 = r'C:\zData\a.txt'
infile2 = r'C:\zData\b.txt'

csvfile1  = open(infile1, 'r')
myreader1 = csv.DictReader(csvfile1)

csvfile2  = open(infile2, 'r')
myreader2 = csv.DictReader(csvfile2)

for row1 in myreader1:

    for row2 in myreader2:

        print "GID = " + row1['GID'] + ", ABC = " + row2['ABC']

我怀疑这是一个简单的问题,但由于某种原因,此代码仅读取外循环的第一行(infile1)和内循环的所有行(infile2)。

我究竟做错了什么?我尝试添加 myreader1.next 但这似乎没有什么不同。

谢谢。

4

2 回答 2

2

您只能在 acsv.readercsv.DictReader对象上循环一次;那么文件指针在文件的末尾。

您可能应该只将第一个文件(较小的文件)中的所有行读入保存在内存中的列表中:

with  open(infile1, 'r') as csvfile1:
    rows1 = list(csv.DictReader(csvfile1))

现在,您可以根据需要多次循环该列表:

with open(infile2, 'r') as csvfile2:
    myreader2 = csv.DictReader(csvfile2)

    for row1 in myreader2:
        for row2 in rows1:
            print "GID = " + row1['GID'] + ", ABC = " + row2['ABC']

myreader2另一种方法是每次在循环内重新打开:

with open(infile1, 'r') as csvfile1:
    myreader1 = csv.DictReader(csvfile1)
    for row1 in myreader1:
        with open(infile2, 'r') as csvfile2:
            myreader2 = csv.DictReader(csvfile2)

            for row2 in myreader2:
                print "GID = " + row1['GID'] + ", ABC = " + row2['ABC']

但是,如果您需要显示两个文件之间的匹配项,请将第一个文件读入字典:

with  open(infile1, 'r') as csvfile1:
    rows1 = {row['GID']: row for row in csv.DictReader(csvfile1)}

现在rows1是一个字典,将键映射GID到列出该值的行。这假设每一行都有一个唯一的GID值。

这将使将行与第二个 CSV 文件中的信息进行匹配变得容易:

with open(infile2, 'r') as csvfile2:
    myreader2 = csv.DictReader(csvfile2)

    for row in myreader2:
        if row['GID'] in rows1:
            print 'Matching GID {}!'.format(row['GID'])
            print 'infile1: {}'.format(rows1[row['GID']])
            print 'infile2: {}'.format(row)
于 2013-05-07T19:28:26.017 回答
0

这个怎么样

f = ["gid={}, abc={}".format(x['gid'],y['abc']) for y in myreader2 for x in myreader1]
print f
于 2013-05-07T21:24:12.500 回答