私は自分自身にPythonを教えており、テキストファイルを検索する方法を学びたいと思っていました。たとえば、フルネームとアドレスの長いリストがあり、名を入力して、その名前に対応する詳細を印刷できるようにしたいとします。これについて行くための最良の方法は何でしょうか?ありがとう!
私が持っているデータは、次のような列の.txtファイルにあります。
Doe, John London
Doe, Jane Paris
私は自分自身にPythonを教えており、テキストファイルを検索する方法を学びたいと思っていました。たとえば、フルネームとアドレスの長いリストがあり、名を入力して、その名前に対応する詳細を印刷できるようにしたいとします。これについて行くための最良の方法は何でしょうか?ありがとう!
私が持っているデータは、次のような列の.txtファイルにあります。
Doe, John London
Doe, Jane Paris
私はsplit
コマンドを賢明に使用します。もちろん、ファイルがどのように区切られているかによって異なりますが、例では、データ フィールドを分割する文字がスペースであることを示しています。
ファイルの各行に対して、次のようにします。
last, first, city = [data.strip(',') for data in line.split(' ') if data]
そして、それらの属性に基づいて比較を実行します。
明らかに、データ フィールドにスペースが含まれている場合、これは壊れます。そのため、このような単純なアプローチを取る前に、そうでないことを確認してください。
データ形式を設計した場合、固定幅の列はあまり適していません。しかし、それらに行き詰まっている場合は、簡単に対処できます。
まず、データを解析します。
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))
しかし、それは良くありません。新しい "John" ごとに、以前の "John" が消去されます。したがって、私たちが本当に必要としているのは、名をタプルのリストにマッピングする辞書です。
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" がいない場合は、何も得られません。素敵なエラーメッセージの方がいいかもしれません。ただし、基本が機能するようになったら、後でいつでも追加できます。
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
次のような簡単なことを行うことができます。
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
名を入力してください: Jane ドウ、ジェーン・パリス
関連文書