首页 文章

有条件地从python中的文件读取一行行

提问于
浏览
0

我有一个地址簿,并希望有效地打印所有(可能是多个)条目,以获得给定的“姓氏” .

条目具有以下结构:

Johnsen  
Paul  
First Street  
313  
94134  
State1  
1343154622525  
myemail101@mail.com  

Parker  
Peter  
Scnd Street  
44  
91347  
State2  
1343154622525  
myemail224@mail.com  

...

到目前为止我的代码如下:

print("1) Look up by last name")
print("2) Add a person to address book")
print("3) Quit App")

choice = int(input("Enter your choice (1/2/3): "))
if choice == 1:
    lname = input("Enter last name: ")

    addressbook = open("addressbook.txt", "r")

    import itertools
    lnameLines = itertools.islice(addressbook, 0, None, 9)
    matchingLines = []
    lineNumber = 0
    for n in lnameLines:
        if lname.lower() == n.rstrip().lower():
            matchingLines.append(lineNumber)
    lineNumber = lineNumber + 9
print(matchingLines)

这产生的是匹配的9行块的起始行(包括空白行) . 现在我想知道如何生成和使用一个可以再次打开文件的序列,并只读取匹配的块来查找 . 我很确定还有一种更有效的方法,我很好奇 .

感谢帮助 .

3 回答

  • 0

    您始终可以将文件加载到dict中,其中key为l_name,data为所有内容 . 我为你写了一个小工作部分 . 我建议创建一个类Address_book,它具有加载数据,搜索,添加数据和写回数据的功能 . 这将是简单而直接的,但我不会为你做一切!

    def load_book(book):
        #assuming your layout never changes
    
        f = open(book, 'rb').readlines()
        ind = 0
    
        for i in f:
            if i == '\r\n': #find the empty line seperating each person
                f[ind] = '--'
            ind += 1
    
        f = [x.split(':') for x in ''.join(f).replace('\r', '').replace('\n', '').replace('  ', ':').lower().split('--')]
    
        data = {}
        for i in f:
            data[i[0]] = list(x for x in i if i != '')
    
        return data
    
    def search_book(book, person):
        try:
            return book[person.lower()]
        except:
            for i in book:
                if person.lower() in i:
                    return book[i]
            else:
                raise KeyError
    
    book = load_book('add')
    print search_book(book, 'Parker')
    
  • 0

    如果您的文件足够小以适合内存,则可以将数据存储在dict中,其中每个姓氏对应于一个或多个条目的列表:

    from collections import defaultdict
    
    with open('test.txt') as f:
        dct = defaultdict(list)
        for block in f.read().split('\n\n'):
            dct[block[:block.find('\n')].strip()].append(block)
    
    
    def lookup(last_name):
        print('\n\n'.join(dct.get(last_name, [])))
    
    
    # In [61]: q.lookup('Johnsen')
    # Johnsen  
    # Paul  
    # First Street  
    # 313  
    # 94134  
    # State1  
    # 1343154622525  
    # myemail101@mail.com
    

    的test.txt

    Johnsen  
    Paul  
    First Street  
    313  
    94134  
    State1  
    1343154622525  
    myemail101@mail.com  
    
    Parker  
    Peter  
    Scnd Street  
    44  
    91347  
    State2  
    1343154622525  
    myemail224@mail.com
    
  • 0

    谢谢你的建议 . 我非常欣赏 Build 地址簿类的想法以及内存中的方法,尽管不是我需要的 .

    我的 - 不是最有效但最简单的 - 解决方法如下所示:

    choice = int(input("Enter your choice (1/2/3): "))
    if choice == 1:
    lname = input("Enter last name: ")
    
    book = open("addressbook.txt", "r")
    
    for i, line in enumerate(book):
        if (i % 9 == 0 and 
            lname.lower() == line.rstrip().lower()):
            load = 9
        if load > 0:
            print(line.rstrip())
            load = load - 1
    

    关于避免遍历文本文件的每一行的任何建议都非常受欢迎 .

相关问题