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

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

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

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

Python

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

Q&A

解決済

1回答

1302閲覧

python 引数とデーターの定義について

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2020/11/29 00:27

ネットワークの速度を計測し、CSVファイルに書き込み/追記するプログラムを
作成しておりますが、下記、2カ所で、NameError xxx date_str is not defined(そんなの定義されてないよ) が発生してしまいます。

CSVファイルを作成/追記する関数**def get_Speed_File(speedData):**内で
変数として定義するべきなのか、定義する場合は、どのように定義するのか、
または、**def get_Speed_File(speedData):**に渡す引数が間違っているのか
分からない状態です。

ご教示いただければと思います。

python

1writer.writerow([date_str, time_str, mbps_down_result, mbps_up_result])

python

1writer.writerow({'Date': date_str, 'Time': time_str, 'Download': mbps_down_result, 'UPload':mbps_up_result })

python

1import csv 2import os 3import datetime 4import speedtest 5 6# 計測結果を記述するCSVファイル作成/追記 7def get_Speed_File(speedData): 8 f_name = 'SpeedTest.csv' 9 10 # SpeedTest.csvが存在する場合は、結果を追記 11 if (os.path.exists(f_name)): 12 with open(f_name, 'a', newline='') as csv_file: 13 writer = csv.writer(csv_file) 14 writer.writerow([date_str, time_str, mbps_down_result, mbps_up_result]) 15 else: 16 # SpeedTest.csvが存在しない場合は、speedTest.csvを作成し、計測結果を記載 17 # フィールドは、「計測日(YYYY/MM/DD)」「計測実施時間(HH:MM)」「Download速度」「Upload速度」 18 with open(f_name, 'w', newline='') as csv_file: 19 filednames = ['Date', 'Time', 'Download', 'UPload'] 20 writer = csv.DictWriter(csv_file, fieldnames=filednames) 21 writer.writeheader() 22 writer.writerow({'Date': date_str, 'Time': time_str, 'Download': mbps_down_result, 'UPload':mbps_up_result }) 23 24def get_speed_test(): 25 servers = [28910, 20976] 26 stest = speedtest.Speedtest() 27 stest.get_servers(servers) 28 stest.get_best_server() 29 return stest 30 31 32def command_line_runner(): 33 # 「計測日(YYYY/MM/DD)」「計測実施時間(HH:MM)」を設定 34 tmp_day = datetime.date.today() 35 tmp_time = datetime.datetime.today() 36 date_str = tmp_day.strftime('%Y/%m/%d') 37 time_str = tmp_time.strftime('%H:%M') 38 39 stest = get_speed_test() 40 down_result = stest.download() 41 up_result = stest.upload() 42 mbps_down_result = int(down_result / 1024 /1024) 43 mbps_up_result = int(up_result / 1024 /1024) 44 45 # 「計測日(YYYY/MM/DD)」「計測実施時間(HH:MM)」「Download速度」「Upload速度」の 46 # 計測結果をresult 変数に格納 47 result = [date_str, time_str, mbps_down_result, mbps_up_result] 48 # SpeedTest.csv作成/追記するための関数呼び出し。引数に計測結果(result)をセット 49 get_Speed_File(result) 50 51 print(result) 52 53command_line_runner() 54

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

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

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

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

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

guest

回答1

0

ベストアンサー

get_Speed_File関数でspeedDataという名前で受け取ったリストを、各変数に分解してください。

# 計測結果を記述するCSVファイル作成/追記 def get_Speed_File(speedData): f_name = 'SpeedTest.csv' date_str , time_str, mbps_down_result, mbps_up_result = speedData # <=====この行を追加 (以下略)

全体的に整理するならば以下のようになるでしょうか。
・write_data関数で引数をリストから辞書にしています。.writerowに辞書を渡せば自動的にキーをヘッダと紐付けて書き込めます。
・openでmode='a'を指定して、ファイルが存在しない場合は、自動的にファイルが新規作成されます。これで行を減らせます。
ただしヘッダの書き込みをファイルの新規作成時のみに限定する場合は、下記(is_new_fileの部分)のように既存ファイルの有無をチェックする必要があります。

import csv import os import datetime import speedtest # 計測結果を記述するCSVファイル作成/追記 # 引数にDate, Time, Download, Uploadをキーに持つ辞書を受け取る。 def write_data(result): f_name = 'SpeedTest.csv' # SpeedTest.csvが新規ファイルかどうかを表すフラグ is_new_file = False if os.path.exists(f_name) else True # speedTest.csvを作成し、計測結果を記載 # ファイルがない場合は新規作成され、ファイルが存在する場合は追記される。 with open(f_name, 'a', newline='') as csv_file: # フィールドは、「計測日(YYYY/MM/DD)」「計測実施時間(HH:MM)」「Download速度」「Upload速度」 writer = csv.DictWriter(csv_file, fieldnames=result.keys()) # SpeedTest.csvが新規ファイルの場合のみ、ヘッダを書き込む if is_new_file: writer.writeheader() # 結果をファイルに書き込む writer.writerow(result) def get_speed_test(): servers = [28910, 20976] stest = speedtest.Speedtest() stest.get_servers(servers) stest.get_best_server() return stest def command_line_runner(): # 「計測日(YYYY/MM/DD)」「計測実施時間(HH:MM)」を設定 tmp_day = datetime.date.today() # 計測日(YYYY/MM/DD) date_str = tmp_day.strftime('%Y/%m/%d') # 計測実施時間(HH:MM) time_str = tmp_day.strftime('%H:%M') # 速度を計測する。 stest = get_speed_test() down_result = stest.download() up_result = stest.upload() # 「計測日(YYYY/MM/DD)」「計測実施時間(HH:MM)」「Download速度」「Upload速度」の # 計測結果をresult 変数に格納 result = { "Date": date_str, "Time": time_str, "Download": int(down_result / 1024 /1024), "Upload": int(up_result / 1024 /1024) } # 結果を書き込む write_data(result) print(result) command_line_runner()

投稿2020/11/29 00:36

編集2020/11/29 02:25
sfdust

総合スコア1135

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

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

退会済みユーザー

退会済みユーザー

2020/11/29 01:23

ありがとうございました。解決しました。 その他、コードの書き方等、もっと、効率よくすべき箇所が御座いましたらご指摘、アドバイスいただければと思います。
sfdust

2020/11/29 02:17

追記しました。
退会済みユーザー

退会済みユーザー

2020/11/30 12:08

有難うございます!!すごく勉強になります!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問