0

我有 2 个要比较和附加的 .csv 文件。假设第 1 列文件 1 中有数字。我在第 1 列文件 2 中有一组类似的数字——但顺序不同,并非全部都存在。我想搜索文件 1 的第 1 列以查看第 1 列文件 2 中的数字是否匹配。如果匹配,我想通过将列添加到匹配的列来将文件 2 中的信息附加到文件 1数字。我还删除了输入文件中的任何空行。

例如:

File 1
Number Name     EmailAddress
1      Jenny    jj@ymail.com
2      Josh     jh@ymail.com
3      Tony     ty@gmail.org
4      Jeff     jf@youtube.cc


File2
Number Address  
4      123 Walnut St

1      17 Yerlington Wy
7      420 St B


Output File
Number Name  EmailAddress     Address
4      Jeff  jf@youtube.cc    123 Walnut St
1      Jenny jj@ymail.com     17 Yerlington Wy
7      NO ENTRY

这是我到目前为止的代码,它似乎可以做所有事情,但会附加正确的信息。

import csv

f1 = file('inFile.csv', 'rb')
f2 = file('inFile2', 'rb')
f3 = file('outFile.csv', 'wb')

c1 = csv.reader(f1)
c2 = csv.reader(f2)
c3 = csv.writer(f3)

masterlist = [row for row in c2]
for hosts_row in c1:
    row = 1
    found = False
    for master_row in masterlist:
        results_row = hosts_row
        end_row = masterlist
        if any(hosts_row):
            if hosts_row[0] == master_row[0]:
                results_row.append(end_row[row][1])
                found = True
                break

            if not found:
                results_row.append('NO ENTRY')

    if any(hosts_row):
        c3.writerow(results_row)

f1.close()
f2.close()
f3.close()
4

2 回答 2

0

首先,您的 csv 文件中没有分隔符,我不得不像这样重写它们(逗号分隔符):

在文件.csv:

Number,Name,EmailAddress
1,Jenny,jj@ymail.com
2,Josh,jh@ymail.com
3,Tony,ty@gmail.org
4,Jeff,jf@youtube.cc

inFile2.csv:

Number,Address  
4,123 Walnut St

1,17 Yerlington Wy
7,420 St B

那么您的代码中几乎没有问题:

  • 你错过了空 master_row 的检查
  • 奇怪的变量 end_row 正在做一些你不想要的事情并且实际上是无用的,因为你真的想追加master_row[1]
  • for 的条件not found在错误的块中,因此多次附加“NO ENTRY”
  • 有未使用的变量row
  • (只是增强)当文件的变量超出范围时,python 将为您关闭文件,因此您可以删除 close() 调用

在我的修复之后:

import csv

f1 = file('inFile.csv', 'rb')
f2 = file('inFile2.csv', 'rb')
f3 = file('outFile.csv', 'wb')

c1 = csv.reader(f1)
c2 = csv.reader(f2)
c3 = csv.writer(f3)

masterlist = [row for row in c2]
for hosts_row in c1:
    found = False
    for master_row in masterlist:
        results_row = hosts_row
        if hosts_row and master_row:
            if hosts_row[0] == master_row[0]:
                results_row.append(master_row[1])
                found = True
                break

    if not found:
        results_row.append('NO ENTRY')

    if any(hosts_row):
        c3.writerow(results_row)

输出文件:

Number,Name,EmailAddress,Address  
1,Jenny,jj@ymail.com,17 Yerlington Wy
2,Josh,jh@ymail.com,NO ENTRY
3,Tony,ty@gmail.org,NO ENTRY
4,Jeff,jf@youtube.cc,123 Walnut St

高温高压

于 2013-07-14T00:46:24.750 回答
0

另一种看法(这个产生你提出的输出,但我想托马斯的输出就是你所描述的):

import csv

def read_file(path):
    with open(path) as fh:
        data = csv.reader(fh)
        return [row for row in data if row]

def match(l1, l2):
    result = []
    for i in l2:
        match = False
        for j in l1:
            if i[0] == j[0]:
                row = j + i[1:]
                match = True
                break
        if not match:
            row = [i[0], "NO ENTRY"]
        result.append(row)
    return result

if __name__ == '__main__':
    l1 = read_file("inFile.csv")
    l2 = read_file("inFile2")
    result = match(l1, l2)
    of = open('outFile.csv', 'w')
    writer = csv.writer(of)
    writer.writerows(result)
    of.close()

几点注意事项:

您应该使用open而不是file; 在文件模式下,b用于二进制文件(通过在文本模式下打开可以进行行终止转换)。还有更多,但已经解决了。

于 2013-07-14T01:41:31.840 回答