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

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

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

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

Q&A

解決済

2回答

1206閲覧

python  print関数で表示した結果を集計してエクセルに書き込みたい。

monopoly_man

総合スコア9

Python 3.x

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

0グッド

0クリップ

投稿2020/06/25 06:13

編集2020/06/29 03:37

ディレクトリ内にある複数の画像データ(tif.jpeg)の用紙サイズとモノクロorカラー情報を取得し、

  print(size+color)

 を実行すると、下記のような結果を取得することが出来ました。

  A4モノ
A4モノ
A4モノ
A4モノ
A0カラー
A0モノ
A0カラー
A0モノ
A1カラー
A1モノ
A1カラー
A1モノ
A2カラー
A2モノ
A2カラー
A2モノ

 これらを集計して、エクセルにモノクロ、カラーで分けてそれぞれのファイル数の合計を下記のようにエクセル書き込みを行う場合はどのようにコードを書けばよいのでしょうか。[A4モノ:]をA列、[4]をB列。
A列 B列
A4モノ:4    
A2モノ:2
A1モノ:2


A2カラー:2
A1カラー:2

※6/29プログラム全体を質問に追記します。

from PIL import Image

for filename in os.listdir(folder_path):
path_in = os.path.join(folder_path, filename)

※ファイルを開き、解像度を計算  img = Image.open(path_in,'r') dpi = img.info['dpi'] if dpi == (200, 200): result = 200 if dpi == (300, 300): result = 300 if dpi == (400, 400): result = 400 if dpi == (600, 600): result = 600

※ファイルサイズを取得(width,height)
w, h = img.size

w = int(w / result * 25.4) h = int(h / result * 25.4)

※取得したサイズを元にA列に割り振る

if w <= 210 and h <= 297: result = 'A4' elif w <= 420 and h <= 297: result = 'A3' ・ ・ ・ ・ else: result = 'A0_OVERSIZE' size = result

※モノクロorカラーを判断する
mode = img.mode

if mode == '1' : result = 'モノ' if mode != '1' : result = 'カラー' color = result

※表示結果
print(size+color)

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

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

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

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

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

coco_bauer

2020/06/25 08:03

print(size+color)の実行結果が質問に書かれていますが、そこで使われている "size+color"というのは変数名ですか? 変数名だとすると、size+colorの型は何ですか? 集計をする元になるデータが入っているsize+colorの型などの詳細がわからないと、それを処理する(集計するとか、CSVにするとか等々)のは無理です。
monopoly_man

2020/06/25 08:15

coco_bauer様 ご指摘いただいた内容ですが、sizeおよびcolorはそれぞれ変数です。 それをPrint関数で表示する際に+で結合しています。 size+colorの型はstr型です。 宜しくお願い致します。
coco_bauer

2020/06/27 04:22

ということは、print(size+color)を実行すると質問に書かれている16行が表示される訳ではないのですね。 だとすると、何らかのループでprint(size+color)を16回繰り返した結果が質問に書かれている16行ということになります。 それなら、ループを含むプログラムの全体を質問に追加して下さい。
guest

回答2

0

ベストアンサー

まず、質問に書かれたプログラムについて
・Pythonはインデント(行の先頭の文字下げ)によって、実行ブロックを区別するプログラム言語です。ちゃんと字下げをしないと、思ったようには動作しません。Pythonでプログラミングするつもりなら、インデントに注意を払うのが第一歩です。
・同じ変数を異なる用途に使うのは、プログラムミスを引き起こす原因です。質問のプログラムのresult、w、hなどが、そういう使われ方をしています。
・変数には、意味のある名前をつけるようにしてください。時間が経ってからプログラムの見直しや修正をする際に、プログラムの内容の理解がしやすくなります

上記のような視点で、ざっとプログラムを修正してみました。
集計結果はCSVファイルに順不同で出力するようにしてありますから、Excelで読み込んでください。

「モノクロ、カラーで分けてそれぞれのファイル数の合計を下記のように」というのは、Excelで行ってください。C,D列にA列の最初の2文字と、残りの文字を入れて(そういうワークシート関数を入れて)、A~D列を、D列の降順、C列の降順でソートすれば良いです。

もちろん、下記プログラムを修正して実現することも可能です。
がんばって、挑戦してみてください。

このプログラムは、(テストのためのファイル等を用意するのが大変なので)実行テストを行っていませんので、バグを含んでいる可能性があります。

from PIL import Image csvFilePath = os.path.join(folder_path,"data.csv") csvFile = csvFilePath.open(mode='w') as csvF #出力用のcsvファイルを書き込みモードで開いておく for filename in os.listdir(folder_path): path_in = os.path.join(folder_path, filename) dict = {} #集計に使う辞書型の変数dictを初期化 (最初は中身のない辞書) count = 0; #集計に使う整数型の変数count #ファイルを開き、解像度を計算  img = Image.open(path_in,'r') dpi = img.info['dpi'] if dpi == (200, 200): dotsPerInch = 200 elif dpi == (300, 300): dotsPerInch = 300 elif dpi == (400, 400): dotsPerInch = 400 elif dpi == (600, 600): dotsPerInch = 600 #画像サイズをPixcel単位で取得(width,height) w, h = img.size #画像サイズをmm単位に変換 w_mm = int(w / dotsPerInch * 25.4) h_mm = int(h / dotsPerInch * 25.4) #取得したサイズを元にA列に割り振る if w_mm <= 210 and h_mm <= 297: paperSize = 'A4' elif w_mm <= 420 and h_mm <= 297: paperSize = 'A3' # A0,A1,A2の判断部分は省略 else: paperSize = 'A0_OVERSIZE' #モノクロorカラーを判断する mode = img.mode if mode == '1' : mono_color = 'モノ' else: mono_color = 'カラー' #画像のサイズと白黒/カラーを判断した結果を表示    print(paperSize+mono_color) #辞書を使って、集計。(辞書のkeyが画像のデータ('A4モノ'等)で、valueがその画像のデータが出現した件数) if paperSize+mono_color in dict: #その画像のデータは辞書に含まれている dict[paperSize+mono_color] = dict[paperSize+mono_color]+1 #件数を1増やす else:   dict[paperSize+mono_color] = 1 #まだ辞書に含まれていない画像のデータなので、件数は1 #集計結果の出力 for k,v in dict.items: print(k+':', v) #集計結果を画面に表示する csvF.write(k+':'+','+v) #集計結果をcsvファイルに書き込む csvF.close() #csvファイルと閉じる

投稿2020/06/29 06:11

coco_bauer

総合スコア6915

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

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

monopoly_man

2020/06/30 01:31

coco_bauer様 初心者の私でも分かりやすくご教授頂き、ありがとうございました。 多くのヒントを頂きましたので、こちらを参考に完成させます。
guest

0

エクセルに読み込むことのできる形式としてCSVというのがあります
コンマと改行で各項目を区切ればいいです

A4モノ,4    
A2モノ,2
A1モノ,2
...

という形で出力するようにすれば、ゆくゆくはファイルに落として、エクセルで読み込むことができます

投稿2020/06/25 06:22

y_waiwai

総合スコア88042

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

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

monopoly_man

2020/06/25 07:12

y_waiwai様 早々のお返事ありがとうございます。 どのように集計すればよいのか悩んでおります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問