Python 搜索文件并从行返回必填字段的最佳方法

Python 搜索文件并从行返回必填字段的最佳方法,python,file,csv,search,Python,File,Csv,Search,我有下面的代码可以完美地工作。它在txt文件中搜索ID号,如果存在,则返回名字和姓氏 完整列表: 文件内容 001,Joe,Bloggs,Test1:99,Test2:100,Test3:33 002,Ash,Smith,Test1:22,Test2:63,Test3:99 出于教学和学习的目的,我想知道是否有其他方法可以达到同样的效果(优雅、简单、pythonic),或者这是否确实是最好的解决方案 我的问题来自这样一个事实:似乎有可能存在一个内置的方法或某个函数,可以更有效地检索当前索引和搜

我有下面的代码可以完美地工作。它在txt文件中搜索ID号,如果存在,则返回名字和姓氏

完整列表:

文件内容

001,Joe,Bloggs,Test1:99,Test2:100,Test3:33
002,Ash,Smith,Test1:22,Test2:63,Test3:99
出于教学和学习的目的,我想知道是否有其他方法可以达到同样的效果(优雅、简单、pythonic),或者这是否确实是最好的解决方案

我的问题来自这样一个事实:似乎有可能存在一个内置的方法或某个函数,可以更有效地检索当前索引和搜索字段……但可能不是这样


提前感谢您的讨论和我将接受的任何解释作为答案。

您可以将其阅读到列表中,或者更好地阅读字典中的查找时间,然后只需使用以下内容:

如果在l如果在d中(l或d分别为列表/字典)

然而,关于这是否是最简单的方法,或者您现有的解决方案是否是最简单的方法,这是一个有趣的讨论

字典:

   1 # retrieve the value for a particular key
   2 value = d[key]
关于词典使用的时间复杂性和效率的说明:

Python映射必须能够在给定特定键对象的情况下确定哪个(如果有的话)值对象与给定键相关联。一种简单的方法是存储(键、值)对的列表,然后在每次请求值时按顺序搜索该列表。您可以立即看到,对于大量的项,这将非常缓慢-在复杂性方面,这个算法将是O(n),其中n是指映射中的项的数量


Python的dictionary就是答案,尽管它并不总是最好的解决方案-该实现通过要求键对象提供“哈希”函数,将字典查找的平均复杂性降低到O(1)。在您的情况下,由于您正在处理的数据在结构上并不十分复杂,因此可能最容易坚持您现有的解决方案,但如果您追求的是时间效率,则当然应该考虑使用字典

如果列表保持这种格式,您可以通过索引访问行的字段,将其压缩一点

for row in studentfileReader:
    if row[0]==id:
        print(row[1]+" "+row[2])

如果ID不在开头,而是介于两者之间,那么它也可以避免匹配,例如“Test1:002”

我真的不知道是否存在“pythonic”方法来查找匹配键上的记录,但下面的示例在您自己的示例和其他答案的基础上添加了一些有趣的内容,例如使用生成器,和理解。此外,还有什么比一行更像蟒蛇呢

any
是一个内置的python,您可能会对它的存在感兴趣,因为它与您所做的完全一样

with open("studentinfo.txt","r") as f:
    sid=input("Enter Id:")
    print any((line.split(",")[0] == sid for line in f.readlines()))

您可能应该考虑使用<代码> CSV.DistReADER 用于此用法,因为您的表数据具有一致的列。

如果您只想检索一次数据,那么您可以简单地遍历该文件,直到第一次出现所需的id,如下所示

import csv

def search_by_student_id(id):
    with open('studentinfo.txt','r') as f:
        reader = csv.DictReader(f, ['id', 'surname', 'first_name'],
                                restkey='results')
        for line in reader:
            if line['id'] == id:
                return line['surname'], line['first_name']

print(search_by_student_id('001'))
# ('Joe', 'Bloggs')
但是,如果您计划多次从这些数据中查找条目,那么创建字典将是值得的,因为创建字典的成本更高,但会显著减少查找时间。然后你可以像这样查找数据

def build_student_id_dict():
    with open('studentinfo.txt','r') as f:
        reader = csv.DictReader(f, ['id', 'surname', 'first_name'],
                                restkey='results')
        student_id_dict = {}
        for line in reader:
            student_id_dict[line['id']] = line['surname'], line['first_name']
        return student_id_dict

student_by_id_dict = build_student_id_dict()
print(student_by_id_dict['002'])
# ('Ash', 'Smith')

有趣。非常感谢。是否有其他用户可以投票选择最佳方法的功能。我怎么可能知道什么才是真正最棒的?!您的解决方案是否可以打印相应的iD?我想是的,我还没有测试过。老实说,我无法回答你什么是最具python风格的,只是在这种情况下,直接访问似乎更有用,也更安全。出于几个原因,构建字典可能是一个有趣的方法,然后按0(n)搜索它等等……我喜欢这个——但为了教学/学习的目的,很难轻松地解释它(就分析每一行并解释它而言,这并不明显)。非常感谢。我同意,这不是一件应该直接强加给初学者的事情。但由于您提到了教学目的,我认为引入一些python关键概念很有趣:)。这不是一个很好的解决方案。首先,当您的ID始终存储在第一列时,您可以遍历行中的所有字段,如果找不到ID,您没有任何消息来提醒用户,并且在遍历打开的文件时,您将自己限制为一个一致的ID查找。
def build_student_id_dict():
    with open('studentinfo.txt','r') as f:
        reader = csv.DictReader(f, ['id', 'surname', 'first_name'],
                                restkey='results')
        student_id_dict = {}
        for line in reader:
            student_id_dict[line['id']] = line['surname'], line['first_name']
        return student_id_dict

student_by_id_dict = build_student_id_dict()
print(student_by_id_dict['002'])
# ('Ash', 'Smith')