搜索txt文件中的数据

时间:2012-12-12 22:37:45

标签: python

我正在自学python,想学习如何搜索文本文件。例如,我有一长串的全名和地址,并希望能够键入名字,然后打印与该名称对应的详细信息。最好的方法是什么?谢谢!

我所拥有的数据位于.txt文件中,如下所示:

Doe, John        London
Doe, Jane        Paris

4 个答案:

答案 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