如何将CSV列表规范化为2个或更多个独立文件?

2024-06-16 11:37:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集(csv)的人和他们的投票地点,如:

**Person | Voting Place | VP address | ....**

John Doe | Zoo | 123 fake street | ....

Jane Doe | Zoo | 123 fake street | ....

Joey Ramone | Park | 814 Real Street | ...

我希望将这些数据规范化,以便将位置提取到一个单独的列表中,进行重复数据消除,并分配一个任意的ID#。然后,这些人被存储在一个单独的文件中,引用投票位置ID,而不是实际的信息。在

我了解如何使用python集对一组列进行重复数据消除,并将它们拆分到各自的文件中。我不明白的是,如何获取/分配SET()列表中每个元素的ID,以便以后引用它?这是否可以通过csv在一次迭代中完成,从而使伪代码

^{pr2}$

有没有一种方法可以在纯python/csv中实现这一点,还是需要启动一个适当的关系数据库来完成这项工作?在


Tags: 文件csv数据idstreet列表place投票
1条回答
网友
1楼 · 发布于 2024-06-16 11:37:48

你可以用字典。使用投票位置作为关键字,对于相应的值,列出在那里登记的选民的列表:

import csv
from collections import OrderedDict


data = OrderedDict()
with open('input.txt') as f:
    reader = csv.reader(f, delimiter='|')
    for row in reader:
        row = [e.strip() for e in row]
        person   = row[0]
        location = (row[1], row[2])

        if location not in data: data[location] = []

        data[location].append(person)

# Show voting places
print("Voting places (voting_place_id, voting_place):")
for (i,k) in enumerate(data):
    print("  %3d %s" % (i,k))
print("")

# Show voters
print("Voters (voting_place_id, person):")
for (i,k) in enumerate(data):
    for p in data[k]:
        print("  %3d %s" % (i,p))
print("")

输出:

^{pr2}$

在运行此脚本之间没有保存状态,因此,如果您使用一半的数据集运行它一次,然后再运行其余的数据集,那么相同的“位置id”将被重用,而不考虑第一次运行时生成的id。在

但是,如果您将数据附加到原始数据,并再次运行该程序,则第一次运行生成的id将与第二次运行生成的id相匹配,前提是第一次出现的行中没有任何更改(这就是为什么我们使用OrderedDict而不是dict)。在

如果需要持久状态,可以在运行之间始终^{}和{}字典。或者将已排序的键转储到一个文件中,并用这些键初始化data字典。在

相关问题 更多 >