繁体   English   中英

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

[英]conditionally reading a block of lines from file in python

我有一个通讯录,并希望为给定的“姓氏”有效地打印所有(可能多个)条目。

条目具有以下结构:

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行代码块的起始行(包括空白行)。 现在,我想知道如何生成和使用一个序列,该序列将再次打开文件并仅读取匹配的块进行查找。 我敢肯定,对此我也感到好奇,还有一种更有效的方法。

感谢帮助。

您总是可以将文件加载到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')

如果您的文件足够小以适合内存,则可以将数据存储在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

多谢您的建议。 我确实很欣赏建立通讯录类和内存中方法的想法,尽管不是我所需要的。

我的-不是最有效的方法,而是最简单的-解决方法如下:

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

最好避免在文本文件的每一行中进行迭代。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM