質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

ファイルのデータを辞書にする

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 538

makaron

score 11

あるデータを持つファイルを読み込んで、それを辞書型にするコードを書きたいです。
私の書いたコードではエラーはでないのですが、結果も出力されません。何が違うのかおしえて頂きたいです。
(あくまでもファイルを読みこみ、それを辞書型にするという形で、直接辞書を作るということは避けたいです)

あるファイル

りんご\t 123\t わかめ\t 2536
みかん\t 245\t かつお\t 1234
:
:
:
(このように続いていきます)

これを、dictionary構造で、
key='りんご:わかめ'
'みかん:かつお'
value='123:2536'
'245:1234'
のように、分類したいです。

以下が私の書いたコードなのですが、エラーもでないので、どこが間違えているのかがわかりません。python初心者なので、解説もつけて答えを教えてくださると助かります。よろしくお願いします。

f = open(ファイル名)
dictionary = {}
for line in f:
    inputs = line.split("\t")
    if len(inputs) != 4:
    continue
 dictionary['inputs[0]:inputs[2]']='inputs[1]:inputs[3]'
    print dictionary.keys()

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayataka2049

    2018/08/02 22:12

    インデントがどう考えてもおかしい状況なので、「エラーもでない」状況のコードをコピペして貼ってください

    キャンセル

  • makaron

    2018/08/02 22:19

    ありがとうございます。そうしたいのですが、今macからterateilへの質問や、回答が一切つながらず、困っている状況です。スマホからコードを写して打っているので、コピペができません。申し訳ありません。インデント、もう一度確認してみます。

    キャンセル

  • hayataka2049

    2018/08/02 22:26

    PCから繋がらないという状況がかなり意味不明ですが(そもそもネットに繋がってない、teratailにログインしてないとかそういう次元の問題?)、そうだとしてもPCからメールとかオンラインストレージとかでスマホに送って、コピペするだけっすね

    キャンセル

回答 3

+1

dictionary['inputs[0]:inputs[2]']='inputs[1]:inputs[3]'

インデントがおかしい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/02 22:13

    ご指摘ありがとうございます!
    変更してみましたが、なにもかわらないみたいでした、、(パソコンの方のコードを直しました。)現在、自分のパソコンからterateilにつながらず、スマホでコードを打っているので、上の画面上だとうまく変更ができないのですが、実際のコードはcontinueと同じとこにしました。

    キャンセル

+1

文字列の中に変数の値を埋め込みたい場合は、ちょいと工夫しなければなりません。

>>> answer = 42
>>>
>>> 'answer=answer'
'answer=answer'
>>>
>>> 'answer=%s' % (answer,)
'answer=42'
>>>
>>> 'answer={0}'.format(answer)
'answer=42'
>>>
>>> f'answer={answer}'
'answer=42'

なお、最後の書き方はPython3.6以降で導入されているf-string記法です。


ご提示のコードを見る限り、Python2.7を利用されているようですね。
質問にはPythonのバージョンを明記するようにしてください。

なお、Python2.7のサポートは2020年に打ち切られます。
特段の理由が無ければ、3系に乗り換えることを強く推奨します。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/02 22:22

    たびたび申し訳ありません。
    今、文字列1つ1つにIDがあるので、そちらで分類することも可能です。
    例えばりんごを23 わかめを34のようにして、keyを'23:34'のようにして扱えます。この場合は先ほどの私のコードを修正すれば表示できるようになりますか?

    キャンセル

  • 2018/08/02 22:24

    文字列対IDの辞書を生成すれば可能かと。

    キャンセル

  • 2018/08/02 22:34

    何回も読んだら理解ができました!
    ありがとうございます。文字列を使わない方法でやってみようと思います!

    キャンセル

checkベストアンサー

0

インデントが崩れてるとどうしようもないのがpythonなのですが・・・はやくパソコンから繋がるようにしてくださいね。
(というか、繋がらないってなんだろう。ネットが繋がってログインできれば良いだけだと思うんですが)

とりあえず、正しいであろうインデントに戻す。

txt = """りんご\t123\tわかめ\t2536
みかん\t245\tかつお\t1234"""

f = txt.splitlines()  # てぬき
dictionary = {}
for line in f:
    inputs = line.split("\t")
    if len(inputs) != 4:
        continue
    dictionary['inputs[0]:inputs[2]'] = 'inputs[1]:inputs[3]'
print(dictionary.keys())

continueと同じとこ

そこにdictionary以下のコードを入れると、何も実行されないことでしょう。

残念ながら文字列中に書いた式を適切に評価してくれたりはしないので(python3.6以降ならf-stringがありますが)、%記法とかstr.formatとかを使って組み立ててもいいし、慣れないうちは簡単に文字列連結で書いてもいいでしょう。

txt = """りんご\t123\tわかめ\t2536
みかん\t245\tかつお\t1234"""

f = txt.splitlines()  # てぬき
dictionary = {}
for line in f:
    inputs = line.split("\t")
    if len(inputs) != 4:
        continue
    dictionary[inputs[0]+":"+inputs[2]] = inputs[1]+":"+inputs[3]  # +演算子で結合
print(dictionary.items())  # keysだけ見ても仕方ないのでitemsにしておく
""" =>
dict_items([('りんご:わかめ', '123:2536'), ('みかん:かつお', '245:1234')])
"""

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/02 22:25

    ありがとうございます!
    これで今から実装してみます。以前はつながっていたんですが、一週間くらい前からいきなりつながらなくなり、質問するボタンを押すとずっと画面が止まってしまいます。(なので、スマホを使っています)
    実装してみて、分からないことがあればまた質問させていただきます。よろしくお願いします。

    キャンセル

  • 2018/08/02 22:27

    ブラウザの問題ですかね。キャッシュ消したり、最新版に更新したりで治りませんか。あとは、他のブラウザからだと繋がったりしません?

    キャンセル

  • 2018/08/02 22:32

    一応、他のブラウザで試したり、アカウント作り直したりはしてみたのですがどれもだめでした。教えていただいた前者の二つはやっていないのでやってみます!アドバイスありがとうございます。
    また、教えていただいたコードで実行ができました!ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る