我正在自学python,想学习如何搜索文本文件。例如,我有一长串的全名和地址,并希望能够键入名字,然后打印与该名称对应的详细信息。最好的方法是什么?谢谢!
我所拥有的数据位于.txt文件中,如下所示:
Doe, John London
Doe, Jane Paris
答案 0 :(得分:1)
如果您设计了数据格式,则固定宽度列不是很好的列。但如果你坚持使用它们,它们很容易处理。
首先,您要解析数据:
addressbook = []
with open('addressbook.txt', 'r') as f:
for line in f:
name, city = line[:17], line[17:]
last, first = name.split(',')
addressbook.append((first, last, city))
但是现在,您希望能够使用名字进行搜索。你可以这样做,但对于一个庞大的地址簿来说可能会很慢,而且代码也不是很直接:
def printDetails(addressbook, firstname):
for (first, last, city) in addressbook:
if first == firstname:
print fist, last, city
如果我们使用字典而不是只是一个元组列表,将名字映射到另一个字段会怎么样?
addressbook = {}
with open('addressbook.txt', 'r') as f:
for line in f:
name, city = line[:17], line[17:]
last, first = name.split(',')
addressbook[first]=((last, city))
但这并不好 - 每个新的“约翰”都会抹掉任何以前的“约翰”。所以我们真正想要的是一个字典,将名字映射到元组的列表:
addressbook = collections.defaultdict(list)
with open('addressbook.txt', 'r') as f:
for line in f:
name, city = line[:17], line[17:]
last, first = name.split(',')
addressbook[first].append((last, city))
现在,如果我想查看该名字的详细信息:
def printDetails(addressbook, firstname):
for (last, city) in addressbook[firstname]:
print firstname, last, city
无论你走哪条路,都有一些显而易见的地方可以改善这一点。例如,您可能会注意到某些字段在开头或结尾处有额外的空格。你怎么能摆脱那些?如果您在“Joe”上拨打printDetails
并且没有“Joe”,则您什么都得不到;也许一个很好的错误信息会更好。但是,一旦你掌握了基础知识,你可以随时添加更多。
答案 1 :(得分:1)
我会明智地使用split
命令。当然,这取决于文件的分隔方式,但是您的示例显示分割数据字段的字符是空格。
对于文件中的每一行,请执行以下操作:
last, first, city = [data.strip(',') for data in line.split(' ') if data]
然后根据这些属性运行比较。
显然,如果您的数据字段中包含空格,这将会中断,因此在采用这样的简单方法之前,请确保不是这样。
答案 2 :(得分:0)
你可以做一些简单的事情:
name = raw_input('Type in a first name: ') # name to search for
with open('x.txt', 'r') as f: # 'r' means we only intend to read
for s in f:
if s.split()[1] == name: # s.split()[1] will return the first name
print s
break # end the loop once we've found a match
else:
print 'Name not found.' # this will be executed if no match is found
Type in a first name: Jane Doe, Jane Paris
相关文档
答案 3 :(得分:0)
要在python中读取文本文件,可以执行以下操作:
f = open('yourtextfile.txt')
for line in f:
//The for-loop will loop thru the whole file line by line
//Now you can do what you want to the line, in your example
//You want to extract the first and last name and the city