

初心者です。  
テキストファイル（a.txt)に記載されている文字と文字列が完全一致した行の文字列を取得したい。

a.txt  
1,ringo,250  
2,banana,100  
3,mikan,150

文字列がringoだった場合、後ろの250を取得したい。


CC BY-SA 4.0
2018-10-04T06:33:05.857
48956
2018-10-06T09:13:24.923
2018-10-06T09:13:24.923
3060
30329
question
python python3
完全一致検索がしたい


オーソドックスに、こういうのはいかがでしょうか。  
最初の番号、1,2,3は省いています。省かなかった場合は、インデックスの指定が一個増えます。

[code]

    b = open("a.txt","r")
    data = b.readlines()
    #dict内包表記を使う 3.x系です。
    datas = {i.rstrip().split(",")[0]:i.rstrip().split(",")[1] for i in data}
    print(datas)
    
    print(datas["ringo"])
    print(datas["banana"])
    print(datas["mikan"])
    
[/code]

**実行結果**

[code]

    {'ringo': '250', 'banana': '100', 'mikan': '150'}
    250
    100
    150
    
[/code]

辞書型のオブジェクトを作り、それに対応させてしまえば、後はその引数に任意の果物の名前を入れてあげればよいです。結果が`int`型であることをお望みであるのなら、

[code]

    int(datas["mikan"])
    
[/code]

等のように、`int`型のコンストラクタに渡してください。

**追記：**  
検索したキーの要素が、全く無い場合を確かめたいのであれば、  
このように書いてください。検索するということなので、検索するハンドラとして、  
`input`を導入してみました。もし別の手段をお考えの場合はそうしてください。

[code]

    b = open("a.txt","r")
    data = b.readlines()
    #dict内包表記を使う 3.x系です。
    datas = {i.rstrip().split(",")[0]:i.rstrip().split(",")[1] for i in data}
    print(datas)    
    print(datas["ringo"])
    print(datas["banana"])
    print(datas["mikan"])
    b.close()
    
    #新しい関数を定義して、キーを指定したら内部で処理を行う。
    def key_error_cover(key):
        try:
           datas[key]
        except KeyError as e:         
            #もし登録されていないものを検索してしまったら、例外を出す   
            print(key,"is not registered")            
            new_value = input("Please,write new value >")
            datas[key] = new_value    
        finally:
            #こうすれば、例外がおきようが起きるまいが、必ず最後には実行されるコードが出来る。
            return datas[key]
    
    
    
    name =  input("please,write the name of your favorite fruit >")
    #関数に、検索希望の名前を渡し、結果をfruit変数へ代入
    fruit = key_error_cover(name)
    
    #対応する値は何かを確認
    print("what is the value?",fruit) 
    
    #メモ帳の中身を更新します。   
    b = open("a.txt","w")
    for i in list(datas.keys()):
        b.writelines(i+","+datas[i]+"\n")    
    b.close()
    
[/code]

`input`では、ユーザーが新しいデータを書き込めるようになっています。  
どこに書き込むのかは、エディタとか、バージョンにもよると思います。インプット画面が出てくる場合もあれば、[cmd](/questions/tagged/cmd
"'cmd' のタグが付いた質問を表示")に直接入力するタイプのものまであります。  
私は[cmd](/questions/tagged/cmd "'cmd'
のタグが付いた質問を表示")に直接入力するタイプのものですが、初心者の方はどこに書けばいいのか、最初は戸惑うと思います。目安としては、please ~
以下のメッセージが出ている最後の箇所に、適当な名前を書き、`Enter`を押してください。本当に適当に書かないようにしてくださいね。これは冗談です。一応書いても修正は容易です。`.txt`ファイルを開いて書き換えればよいです。少し長くなってしまいましたが、解読してみてください。もし、間違えた内容を書き換えるようにしたいのであれば、それもプログラムとして更に作ってみるとよろしいと思います。

わざと存在しない名前を書いた後、対応する値を入れ込んでみてください。  
その後、txtファイルを開くか、更新していただくと、内容は書き換わっていると思います。  
ちなみに繰り返し申し訳ありませんが、最初の番号は全て省いて行っています。  
(多分番号はtxtファイル内にあれば、検索をするには意味がないと思ったので。もし意味があるというのであれば、また教えてください。)

すいません。「該当なし」という文字を出したいという事であれば、  
`except KeyError as e:`  
の下に、`print("該当なし")`等と書いて、それ以降のいらない処理を消していただければ、お望みの結果になると思います。


CC BY-SA 4.0
2018-10-04T07:49:41.320
48960
2018-10-06T07:42:35.973
2018-10-06T07:42:35.973
24284
24284
48956
answer