只读已定义的CSV列

时间:2018-03-06 22:39:52

标签: python csv data-structures

我编写了一个python程序,根据匹配的键连接2个csv表。

我的数据如下:

表1:

 ID;NAME;ADRESS;TEL
 1; Lee; Str.; 12345
 2; Chu; Blv.; 34567

表2:

 AID; FID; XID
 50    1    99
 676   2    678

我的代码如下所示:

data = OrderedDict()
fieldnames = []

with open(join_file, "rt") as fp:
        reader = csv.DictReader(fp, dialect=excel_semicolon)
        fieldsB = reader.fieldnames
    fieldnames.extend(fieldsB)
    for row in reader:
        data.setdefault(row["FID"], {}).update(row)

with open(fileA, "rt") as fp:
    reader = csv.DictReader(fp, dialect=excel_semicolon)
    fieldnames.extend(reader.fieldnames)
    for row in reader:
        data.setdefault(row["ID"], {}).update(row)

fieldnames = list(OrderedDict.fromkeys(fieldnames))

with open("merged2.csv", "wt", newline='') as fp:
    writer = csv.writer(fp, dialect=excel_semicolon)
    writer.writerow(fieldnames)
    for row in data.values():
        writer.writerow([row.get(field, '') for field in fieldnames],)

join操作的工作原理如下,但我的问题是我想从连接的csv中删除表2中的某些字段(例如XID)。有一个简单的方法吗?

我之前的解决方案是使用Pandas,但脚本应该在我不想(不能)安装导入依赖项的服务器上运行。

1 个答案:

答案 0 :(得分:1)

如果你想取出一些东西,你可以使用列表理解来放入一个简单的过滤器。

您可以在此处创建列表。

fieldnames = list(OrderedDict.fromkeys(fieldnames))

过滤掉你不想要的东西。

filtered_fieldnames = [x for x in fieldnames if x != 'XID']

然后将新文件数据更改为已过滤列表。

with open("merged2.csv", "wt", newline='') as fp:
    writer = csv.writer(fp)
    writer.writerow(filtered_fieldnames)
    for row in data.values():
        writer.writerow([row.get(field, '') for field in filtered_fieldnames],)

您可以将其包装在一个函数中,并在创建新文件或希望取出某些内容时调用它。

def create_merged_file(names):

    with open("merged2.csv", "wt", newline='') as fp:
        writer = csv.writer(fp)
        writer.writerow(names)
        for row in data.values():
            writer.writerow([row.get(field, '') for field in names],)

create_merged_file(fieldnames)

filtered_fieldnames = [x for x in fieldnames if x != 'XID']

create_merged_file(filtered_fieldnames)