用Python在CSV中查找项目的帮助
我对Python还很陌生。我有一个不变的csv文件,这里有个例子(我只是把它按行打印在Python控制台上)
['george', 'williams', '277389', 'susan thompson', '2042228888']
['john', 'smith', '833999', 'george smith', '2041118833']
['michael', 'jackson', '281038', 'ronald jackson', '2041128493']
这些是字段标题
['firstname', 'lastname', 'idnumber', 'emergency contact', 'emerg contact ph']
我需要能够输入一个ID号码,这样就可以在csv文件中搜索,并输出这个人的名字、姓氏、紧急联系人和电话号码。有什么想法吗?我真的需要知道从哪里开始,比如,我应该把csv的内容读入一个字典吗?
5 个回答
1
如果你只需要扫描文件一次,找到你想要的那一行,其实没必要把所有数据都转成字典格式。你可以一个一个地读每一行,直到找到你需要的那一行。
import csv
def find_row_by_id(filename, key_column, id):
with f = open(filename, 'rb'):
my_reader = csv.reader(f)
for row in my_reader:
if row[key_column] == id:
return row
raise Error("Could not find row")
print find_by_row('eggs.csv', 2, my_id) # my_id should by a string
如果你的文件很小,而且你需要根据ID进行多次搜索,那就可以像其他回答说的那样,把它转换成字典格式。
但如果你的文件非常非常大,而且你需要快速查找或者进行很多次查找,建议先把你的CSV文件读入一个键值数据库中:适合Linux的可靠高效的键值数据库?
1
我会把这个csv文件转换成sqlite格式,然后用一个查询来获取数据:
SELECT * FROM data WHERE idnumber = %s
我喜欢把数据整理在数据库里,这样将来可能会有更多的好处,比如可以进行更复杂的查询。
要把csv转换成sqlite并测试查询,可以使用Firefox的SQLite管理插件。
4
我个人会选择用字典:
records = [
['george', 'williams', '277389', 'susan thompson', '2042228888'],
['john', 'smith', '833999', 'george smith', '2041118833'],
['michael', 'jackson', '281038', 'ronald jackson', '2041128493'],
]
from operator import itemgetter
recordsbyid = dict(zip(map(itemgetter(2),records),records))
然后你可以这样做:
>>> recordsbyid['277389']
['george', 'williams', '277389', 'susan thompson', '2042228888']
itemgetter
用来选择第二个元素(也就是 id),map
会对每一条记录进行操作,而 zip
则是把 id 和它们对应的记录组合成一个包含 (id, record) 的列表。最后,dict
会把这个列表转换成一个字典。