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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

3回答

1266閲覧

【Python3】csvファイル 関数について

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/05/18 05:15

編集2021/05/18 07:19

行いたい内容は、複数のcsvファイルを読み込み、データを整理した後、一つのファイルに書き出しです。

解決したいこと

まずは、下記に記載しているプログラムの「# CSVファイルを読み込んで辞書のリストで返す関数を実装する」という箇所を関数や定数を用いて実装したいと思っております。
csvモジュールなどモジュールの追加は基本的には行わず実装したいと思っております。

ファイルは下記になります。

商品のマスターデータ →/input/items.csv 商品の売上データ(日毎に別ファイル) →/input/sales_raw_20161030.csv /input/sales_raw_20161101.csv ... /input/sales_raw_20161106.csv 書き出し後の売上データ →/output/sales.csv

商品マスターデータ(items.csv)の中身は下記になります。

商品ID、商品名、商品価格

商品の売上データ(sales_raw_YYYYmmdd.csv)の中身は下記になります。

購入ID、ユーザーID、商品ID、個数、販売日時

書き出し後のデータ(sales.csv)は下記になります。

購入ID、ユーザーID、商品ID、商品名、商品価格、個数、販売日時

*商品の売上データの商品IDと商品マスターデータの商品IDを紐付け、紐付く商品名と商品価格を出力させます。

現状のプログラム

py

1import os 2import re 3 4ITEMS_DATA = 'input/items.csv' 5ITEMS_COLUMNS = ['item_id', 'item_name', 'item_price'] 6 7SALES_RAW_REGEX = re.compile(r'^sales_raw_(\d{4})(\d{2})(\d{2}).csv$') 8SALES_COLUMNS = ['purchase_id', 'user_id', 'item_id', 9 'item_name', 'item_price', 'amount', 'sold_at'] 10SALES_DATA = 'output/sales.csv' 11 12ENCODING = 'utf-8' 13CSV_INPUT = input('') 14 15# CSVファイルを読み込んで辞書のリストで返す関数を実装する 16def read_csv(f, columns): 17 pass 18 19def main(): 20 # 商品のマスターデータ読み込み 21 items = {} 22 with open(ITEMS_DATA, encoding=ENCODING) as f: 23 for row in read_csv(f, items): 24 # CSVファイルを読み込んで辞書のリストで返す関数使う 25 item_id, item_name, item_price = row.rstrip().split(',') 26 items[item_id] = { 27 'item_name': item_name, 28 'item_price': item_price 29 } 30 31if __name__ == "__main__": 32 main()

*コードを抜粋しております。

自分で試したこと

商品マスターデータのwith文をread_csv関数内に記述していたのですが、その場合、関数の使い回しが出来ないので、
「商品マスターデータ読み込み」内に記述したり、read_csvの引数に問題が生じたりしていたので、修正を行ったりしましたが、
結局解決できないまま時間だけが過ぎてしまうので、ご教授頂けますと幸いです。
read_csv関数に関しては、csvモジュールを使用したやり方はたくさんサイトに載っているのですが、今回はcsvモジュールを使わないで実装なので、参考になるサイトも見当たらず、何を記述すると良いのかも分からない状況です。

read_csvで返したい情報としては下記のようなものになります。
[{'item_id': '1', 'name': '掃除機', 'price': '4980'}, {'item_id': '2', 'name': '扇風機', 'price': '2980'}......]

その他に何か必要な情報などありましたら、提示いたします。
大変恐縮ではございますが、ご教授頂けますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

自分だったらまずはこうします

  • read_csv を read_items_csv として、mainにあるwithの処理をほぼそのまま持ってきて、itemsを返すようにする。

  • read_salesraw_csv を作って、同様にファイルを読込み、salesrawを返すようにする。salesrawはdictのリスト

  • salesを作る関数を作る。 引数は、salesrawとitems. salesrawにitemsの内容を加えたもののリストsalesを返す。

  • write_csvを作る。 salesを受け取って出力する。

  • 作った関数をmainで適切に呼び出す。

検討のしどころは、各関数でどこまでパラメータ化するかですかね。

これができて動いたら、read_items_csvとread_salasraw_csvはだいたい同じ処理になりますので、作ってから共通処理部分をくくりだして作り変えるなど改善していく感じでしょう。

投稿2021/05/18 08:15

編集2021/05/18 08:27
TakaiY

総合スコア12804

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

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

0

おはようございます。

問題文読ませていただきました。

こんな感じでいかがしょうか?

import pandas as pd # マスターデータを読み込む。 masterData = pd.read_csv('./items.csv') # 第一引数へcsv開始日付を指定 # 第二引数へcsv終了日付を指定 # 連続した日付の生成参考 : https://analytics-note.xyz/programming/date-ragen-list/ dateIndex = pd.date_range("2016-10-30", end="2016-11-02", freq="D") # 配列に変換して、必要な日付文字列に加工 # 連続した日付の生成参考 : https://analytics-note.xyz/programming/date-ragen-list/ dateList = dateIndex.to_series().dt.strftime("%Y%m%d") # 最終出力結果用に空の変数を用意しておく。 outputData = pd.DataFrame( columns=['商品ID', '商品名', '商品価格', '購入ID', 'ユーザーID', '個数', '販売日時']) for csv in dateList.values: # ファイルが存在しない場合に備えて、例外処理をする。 # ファイルが存在しない場合は、continueを行い、次の日付のファイル読み込みを行う。 # try except参考 : https://note.nkmk.me/python-try-except-else-finally/ try: salesData = pd.read_csv('./sales_raw_' + csv + '.csv') except FileNotFoundError: continue # 商品IDを基準としてmergeする。 # merge参考 : https://note.nkmk.me/python-pandas-merge-join/ innerData = pd.merge(masterData, salesData, on='商品ID', how='inner') # mergeした新しいデータを追記する。 # append参考 : https://note.nkmk.me/python-pandas-assign-append/ outputData = outputData.append(innerData) # csv書き出しを行う。 # csv参考 : https://note.nkmk.me/python-pandas-to-csv/ # reset_index参考 : https://note.nkmk.me/python-pandas-reset-index/ outputData.reset_index(drop=True).to_csv('./sales.csv')

ご確認のほど、よろしくお願いいたします。????‍♂️

投稿2021/05/19 00:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/05/19 01:08

おはようございます。 また、ご回答頂きありがとうございます。 当方pandas as pdというモジュールを使用したことが無いため、頂いた内容での実装が難しく思います。。 ただ、参考サイトの記載やコードに関してもご説明を記載して頂いたりとご親切にありがとうございます! 頂いた知識は今後に必ず活かせる内容だと思いますので、しっかりと拝見させて頂きたいと思います!
退会済みユーザー

退会済みユーザー

2021/05/19 01:40 編集

いえいえ、動作確認もきちんとしていますので、是非ご活用ください〜 また、わからないこととかありましたら、気軽にご相談ください〜!! Enjoy!!!
guest

0

読み込みなら第2引数いらないと思いますけど

投稿2021/05/18 06:16

karintly

総合スコア68

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

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

退会済みユーザー

退会済みユーザー

2021/05/18 06:19

ご確認いただきありがとうございます。 すみません、抜粋したせいで記載が漏れているのですが、仰る通り読み込み処理のみであれば、必要は無いのですが、書き込み処理にも再利用するために第二引数も必要になります。
karintly

2021/05/18 06:30

何故read_csv関数で書き込み処理までやろうとしてるんでしょうか。 読み込みはread_csv関数で引数は1つ(ファイルオブジェクトかファイル名)、書き込みはwrite_csv関数で引数は書き込みデータを加えた2つ。このように分けるべきです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問