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

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

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

2回答

1397閲覧

Python初学者にコードレビューをしてほしい(画像ファイルからスコアを抜き出す)

plmnkoijbvhiu

総合スコア5

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

1グッド

1クリップ

投稿2020/04/18 07:21

前提・実現したいこと

Pythonの勉強を始めたプログラミング初学者です。
練習として、寿司打というタイピングゲームの結果画面をスクリーンショットとして保存しておき、その写真からPythonが自動でスコアなどの情報を読み取り、CSVファイルとして保存してくれるといったようなプログラムを作成しました。
エラーなどはなく思い通りに実行できたのですが、コードが冗長になってしまっている気がしたので、ご経験の豊富な方にコードの改善をお願いしたく質問させていただきました。
コードは以下の通りです。独学で勉強をしていますがもっと成長したいので見ていただけると幸いです。

該当のソースコード

python

1from PIL import Image 2import pyocr 3import pyocr.builders 4import glob 5import os 6import datetime 7import time 8import numpy as np 9import csv 10import math 11 12tool = pyocr.get_available_tools()[0] 13 14# 情報を取得したい写真のパスをリストに格納 15target_path = glob.glob('C:\Users\~\Pictures\Screenshots\*.png') 16 17# 以前実行した日時を取得 18prev_time = np.loadtxt(fname="time.csv") 19# 最終更新を現在時刻に書き換え 20time_manege = [time.time()] 21np.savetxt(fname="time.csv", X=time_manege) 22 23# ここにファイルの作成日時を格納する 24time_list = [] 25 26# スクリーンショットフォルダ内のファイル作成日時を読み取る 27for index, item in enumerate(target_path): 28 unix_time = os.path.getctime(item) 29 time_list.append(unix_time) 30 31 # 前回の更新日よりも古ければパスを除去 32 if prev_time > unix_time: 33 target_path[index] = "" 34 35# ここから文字の読み取り開始 36for index1, item1 in enumerate(target_path): 37 38 # 読み取った文字を格納するためのリスト 39 data_list = [] 40 41 # ファイルが寿司打のものではなかった時に処理をやめる 42 flag = False 43 44 # 更新日フィルターで除去されていないファイルのとき 45 if item1 != '': 46 pic_list = [ 47 Image.open(item1).crop((842, 276, 938, 303)), # im_course 48 Image.open(item1).crop((813, 328, 904, 352)), # im_price 49 Image.open(item1).crop((783, 477, 847, 508)), # im_correct 50 Image.open(item1).crop((1053, 477, 1115, 508)) # im_wrong 51 ] 52 53 # 文字の読み取り 54 for index2, item2 in enumerate(pic_list): 55 text = tool.image_to_string(item2, lang='eng', 56 builder=pyocr.builders.TextBuilder()) 57 if index2 == 0: 58 if text == ">» 5,000": 59 text = 5000 60 if text != 5000 and text != "10,000": 61 flag = True 62 break 63 64 # まず日時の入力 65 std_time = datetime.datetime.fromtimestamp(math.floor(time_list[index1])) 66 std_time = str(std_time) 67 data_list.append(std_time) 68 69 if type(text) == str: 70 text = text.replace(",", "") 71 text = int(text) 72 data_list.append(text) 73 74 if flag == False: 75 with open('data.csv', 'a', newline="") as f: 76 writer = csv.writer(f) 77 writer.writerow(data_list) 78
DrqYuto👍を押しています

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

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

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

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

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

gentaro

2020/04/18 08:27 編集

既についてる回答のとおりだと思いますが、質問の方法が悪いと思う。 どの箇所が「コードが冗長になってしまっている気が」するのかを明らかにし、「こういう改善策があると思うが書き方がわからない」とか、もう少し具体的な質問内容にしたら回答が付きやすいかもしれません。 せめて「冗長だと思っている箇所」「まとめたいと思っている処理」を提示しましょう。
guest

回答2

0

コードレビューのお願いはteratailでは行っていません。これは、依頼となります。

コードレビューは、発注してください。ここはQAサイトです。

投稿2020/04/18 07:25

kai0310

総合スコア2076

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

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

0

コードの冗長さを解消するには方法がある程度決まっています。

  1. ループ等を利用する
  2. 不要な記述を削除する(コメントも多すぎる場合は最小限に抑えたほうが良いです
  3. 同じ処理は関数等にして使いまわす
  4. 改行・空白行の位置や個所を見直す
  5. ファイルを適度に分割する

あくまで、teratailはコードレビューサイトではありません。
もし、これらを実行しても冗長だと感じる場合はその個所を提示したうえで、そのコードに至るまでに試したことや、自分の考えをこの質問を編集の上でお知らせください。
回答者には質問編集の通知が届かない仕様ですので、予めご了承ください。

投稿2020/04/18 15:13

kyoya0819

総合スコア10429

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問