0

我被鼓励走出自己的舒适区,在几乎没有经验的情况下使用 python,现在我被困住了。我正在尝试比较两个 CSV 文件(fileA.csv 和 fileB.csv),并将任何丢失的用户行从 fileB.csv 附加到 fileA.csv。我可以比较的唯一字段是用户的名字和姓氏(在这种情况下,它是每个文件中的 row[0] 和 row[2])。

据我了解,您无法将信息附加到您当前打开的文件中,因此我愿意接受建议,而无需创建第三个文件(如果可能)。下面有我在正确的轨道上,但有很多数据,所以我需要一个循环。请帮忙。

import csv
reader1 = csv.reader(open('fileA', 'rb'), delimiter=',', quotechar='|')
row1 = reader1.next()
reader2 = csv.reader(open('fileB', 'rb'), delimiter=',', quotechar='|')
row2 = reader2.next()


##For Loop...

        if (row1[0] == row2[0]) and (row1[2] == row2[2]):
                ## Compare next 
        else:
                ## Append entire row to fileA.csv

示例文件 A.csv:

John,Thomas,Doe,some,other,stuff
Jane, ,Smith,some,other,stuff

示例文件 B.csv:

John, ,Doe,other,personal,data
Jane,Elizabeth,Smith,other,personal,data
Robin,T,Williams,other,personal,data

应该从 FileB 附加到 FileA 的唯一行是 Robin 的完整行,因此 FileA 看起来像:

所需结果_文件A:

John,Thomas,Doe,some,other,stuff
Jane, ,Smith,some,other,stuff
Robin,T,Williams,other,personal,data
4

2 回答 2

1

首先将在文件 A 中找到的信息存储在一个集合中。

然后,以追加模式重新打开文件 A,并循环遍历文件 B。在集合中找不到 B 中的任何名称,然后可以将其添加到文件 A:

csv_dialect = dict(delimiter=',', quotechar='|')
names = set()
with open('fileA', 'rb') as file_a:
    reader1 = csv.reader(file_a, **csv_dialect)
    next(reader1)
    for row in reader1:
        names.add((row[0], row[2]))

# `names` is now a set of all names (taken from columns 0 and 2) found in file A.

with open('fileA', 'ab') as file_a, open('fileB', 'rb') as file_b:
    writer = csv.writer(file_a, **csv_dialect)
    reader2 = csv.reader(file_b, **csv_dialect)
    next(reader2)
    for row in reader2:
        if (row[0], row[2]) not in names:
            # This row was not present in file A, add it.
            writer.writerow(row)

合并的with行需要 Python 2.7 或更高版本。在早期的 Python 版本中,只需嵌套两个语句:

with open('fileA', 'ab') as file_a:
    with open('fileB', 'rb') as file_b:
        # etc.
于 2013-03-27T10:30:25.437 回答
0

您可以尝试pandas,这可能会帮助您更轻松地处理 csv 文件,并且看起来更具可读性:

import pandas as pd

df1 = pd.read_csv('FileA.csv', header=None)
df2 = pd.read_csv('FileB.csv', header=None)


for i in df2.index:
    # Don't append if that row is existed in FileA
    if i in df1.index:
        if df1.ix[i][0] == df2.ix[i][0] and df1.ix[i][2] == df2.ix[i][2]: continue

    df1 = df1.append(df2.ix[i])

df1.to_csv('FileA.csv', index=None, header=None)
于 2013-03-27T11:09:12.047 回答