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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

777閲覧

テンプレートの辞書を上書きせず、それぞれの処理で更新するには?

shoshi

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/08/08 02:23

編集2019/08/08 02:54

前提・実現したいこと

以下のように辞書を用意し、
csvデータを読み込んだ時に""に値が更新されて、最後に集計したいのですが、
2つ以上同時に読み込むと処理の途中で上書きされてしまい
結果が変わってしまいます。copy()を使うと良いみたいですが
いまいちやり方がわかりません。宜しくお願いします。

前提は
・辞書は書き出しせずメモリ内で更新されること
・同時に2つ以上動かしても辞書が上書きされないこと
・更新される辞書は他pyから読み込んでも情報を維持すること

該当のソースコード

python3

1temp = { 2 "fruits": "", 3  "place" : "", 4 "number": "" 5} 6

使用するcsvデータ

data1

1fruits place number 2apple 100 5

data2

1fruits place number 2orange 120 4

data3

1fruits place number 2grape 150 3

更新された辞書

data1

1case1 = { 2 "fruits": "apple", 3  "place" : "100", 4 "number": "5" 5}

結果出力
例)case1は100円のりんごを5個買ったので500円です。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mokemokechicken

2019/08/08 02:29

- 「どういうCSVデータ」を読み込んで - 「どういう辞書の状態にしたいか」 を具体的に(CSVは2~3行で良いでしょう)書くと、回答しやすいです。
shoshi

2019/08/08 02:48

ありがとうございます。 追記しました。宜しくお願いしますm(__)m
mokemokechicken

2019/08/08 03:33 編集

その書き方だとまだわからないところがあって、 ■ パターンA - csvファイルが3つ(以上)ある - csvファイルは1つのレコード(データ行)しかない(まあ、これはあまり関係ないといえば関係ないのですが) ■ パターンB - csvファイルは1つである - csvファイルには複数のレコードがある のどっちなのでしょうか(それか、別のパターンCなのか)。 また、 - (あ) CSVの(各ファイル&)各行は、行を読み込んだら何か処理を行うので、次の行を読むときには前の行のデータを忘れても良い - (い) CSVの(各ファイル&)各行を全て読み出し、一旦保持しておいて、その後何か処理をしたい でも少し処理は変わると思います。 (い)の場合は普通は辞書をListに入れていきます。(あ)の場合はその必要はないです。 ※ まあ、Bで(い)なのかなぁ、という気はするのですが...
mokemokechicken

2019/08/08 03:38

私の質問も回りくどいですね。。。 もう少し端的に言うと「何に困っているのか」が把握しづらいです。 - こういう入力データがあって、 - こういうプログラムを書いたんだけど、 - こういう結果になってほしいのだが、 - 意に反してこういう結果になってしまって困っている みたいな情報があると回答しやすいんですが。
shoshi

2019/08/08 05:07

パターンAのヘッダー行とレコード行の2行になります。 ファイルが読み込まれたらテンプレートの辞書をコピーしてそれぞれのデータ毎に 辞書が分かれるようにしたいですが、その部分がわからなくて困ってます。
guest

回答2

0

ベストアンサー

ちょっと、「テンプレートをコピーする」動機が不明なので、

  • 3つのCSVファイルがあって
  • 各CSVはHeader行1行、Data行1行のみ
  • 読み込んだデータは、ファイル名をKeyとした辞書として保持

するようなコードだと以下みたいに書くことはできます。
本当に単に辞書をコピーしたりしたいのなら yamap_55 さんのような書き方で良いと思います。

python

1import csv 2 3file_list = ["data1.csv", "data2.csv", "data3.csv"] 4 5results = {} 6for filename in file_list: 7 with open(filename, "rt") as f: 8 reader = csv.reader(f) 9 headers = None 10 for line_no, cols in enumerate(reader): 11 if line_no == 0: 12 headers = cols 13 elif line_no == 1: 14 results[filename] = dict(zip(headers, cols)) 15 16print("data1") 17print(results["data1.csv"]) 18print("data2") 19print(results["data2.csv"]) 20print("data3") 21print(results["data3.csv"])

○ 出力

data1 {'fruits': 'apple', 'place': '100', 'number': '5'} data2 {'fruits': 'orange', 'place': '120', 'number': '4'} data3 {'fruits': 'grape', 'place': '150', 'number': '3'}

○ data1.csv はこんな感じ

fruits,place,number apple,100,5

...

投稿2019/08/08 05:28

mokemokechicken

総合スコア948

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shoshi

2019/08/08 06:18

回答ありがとうございます! 一旦使うデータをリストにすればよかったんですね、助かりました! 伝えるの下手ですみません、ありがとうございましたm(__)m
guest

0

余計な情報が多くてよくわからないのですが、質問タイトルにのみ回答致します。
「dict.fromkeys」を使用すれば良いかと思います。

python

1temp = { 2 "fruits": "", 3 "place" : "", 4 "number": "" 5} 6new_dict = dict.fromkeys(temp) 7 8def hoge(new_dict): 9 # ファイルを読み込んで渡されたdictに格納する関数 10 return new_dict 11hoge(new_dict)

※copyでも良いかと思いますが、今回の場合valueまでコピーする意味はないかと思いますのでfromkeysを選択しました。

投稿2019/08/08 04:19

yamap55

総合スコア1376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shoshi

2019/08/08 05:59

回答ありがとうございます!参考にさせていただきますm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問