【问题标题】:Help with finding item in csv in python帮助在 python 中的 csv 中查找项目
【发布时间】:2011-09-23 23:38:39
【问题描述】:

我是 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']

我需要能够输入身份证号码,这会通过 csv 启动搜索,并输出个人的名字、姓氏、紧急联系人、电话号码。有什么想法吗?我真的需要知道从哪里开始,即,我应该将 csv 的内容读入字典

【问题讨论】:

  • 如果您使用的是终端,简单的grep 277389 file.csv 就足够了。

标签: python search csv return field


【解决方案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 文件读入键值数据库:Reliable and efficient key--value database for Linux?

【讨论】:

    【解决方案2】:

    我会将此 csv 转换为 sqlite 并使用查询:

    SELECT * FROM data WHERE idnumber = %s

    我喜欢使用数据库中组织的数据,它可能会在未来为您带来更多优势(更复杂的查询)。

    要将 cvs 转换为 sqlite 并测试查询,请使用 SQLite Manager addon for Firefox

    【讨论】:

      【解决方案3】:

      让我们首先将每一行变成一个字典,使用字段标题作为键,使用字段数据作为值。我们想要一个字典,其中每个键值对来自我们通过将这两个列表“压缩”在一起来获取的一对:dict(zip(field_titles, row))。我们可以使用列表推导从输入行列表中创建这些字典的列表:[dict(zip(field_titles, row)) for row in data]

      我们希望能够通过 id_number 查找这些,因此我们将创建一个包含 dict,其中键是 idnumber,值是行 dict。我们可以在 row_dict 中查找 idnumber:dict((row_dict['id_number'], row_dict) for row_dict in data)

      【讨论】:

        【解决方案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 把它变成字典。

        【讨论】:

          【解决方案5】:

          使用raw_input 获得想要的id

          当你拥有它时,使用 if 语句来查看 id 是否匹配:

          哪一行是['george', 'williams', '277389', 'susan thompson', '2042228888']

          if line[2] == id:
              for x in line:
                  if not x == line[2]:
                      print x
          

          希望对你有帮助!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-12
            • 1970-01-01
            • 2013-05-08
            • 2014-07-19
            • 2021-04-23
            • 1970-01-01
            相关资源
            最近更新 更多