[英]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.