ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

pythonで表計算ソフトの値を取り出して表示する

(2020-03-31 初稿 - 2021-05-12 転記・修正)

はじめに

エクセル等の表計算ソフトの値を加工したいが、毎回手作業でやるは大変。
マクロでも良いけど、セキュリティ的に受け付けられない場合が心配。
ということで、表計算ソフトの値をpythonで取り出して、加工しようとした。
このページは、相変わらずの筆者の備忘録。(^^ゞ

インストール

表計算ソフトを扱うためには、openpyxlというモジュールをインストールする必要がある。
筆者は、pythonに詳しくないDebian使いなので、DebianRaspberry Piでは、以下のとおりaptの管理のもとインストール。

sudo apt-get install python3-openpyxl 
    (python2の場合:python-openpyxl)

実行例

openpyxlのインストールが終了したら、さっそく表計算ソフトの値を表示させる。
ここでは、test.xlsxというエクセルのブックをサンプルとして用いる。
また、以下のスクリプトをエディタで作成したら、chmod +x で実行権を付与すること。

#!/usr/bin/env python3
#coding: UTF-8

from openpyxl import load_workbook     # openpyxlをロード

file_path = 'test.xlsx'                # サンプルの表計算ブック
wb = load_workbook(filename=file_path) # 表計算ブックをロード
sheet = wb['sheet1']                   # ワークシートを指定

# 全行の値を配列にして表示
for row in sheet:
    value = [cell.value for cell in row]
    print(value)

for row in sheet:
    row_num = row[0].row               # 行番号の取得(参考までに)
    
for i in range(6, 13+1):
    # 6行目から13行目を出力
    # 4列目の値を表示
    print(sheet.cell(column=4,row=i).value)

wb.close()

少しコメントを多く入れたので、わかりやすいかと(^_^;)。

おわりに

思ったよりも簡単に表計算ソフトの値を取り出すことができた。
値が取り出せれば、加工は簡単だよね。
また、何かわかったら追記するね。

関連ページ

pythonで全角半角文字を考慮して文字幅を数える

(2020-04-20 初稿 - 2021-05-12 転記・修正)

はじめに

少し前に bash スクリプトで、全角半角文字を考慮して文字数を数える方法をアップした。

ここでは、pythonで全角半角文字を判別する方法を記述する。
なお、この方法は、以下のサイト等を参考にさせていただき、筆者の備忘録である。

方法

標準モジュールunicodedataの関数east_asian_width()を用いる。
この関数を使うと、全角かなはW、半角英数はNa、全角英数はF、半角カナはH、特殊な文字はAが返ってくる。

したがって、WFAが返ってきたときに全角文字(2バイト)、その他は半角文字(1バイト)として判定する。

import unicodedata

def get_east_asian_width_count(text):
    count = 0
    for c in text:
        if unicodedata.east_asian_width(c) in 'WFA':
            count += 2
        else:
            count += 1
    return count

    print(get_east_asian_width_count('aあイu10')) #ここの文字を修正してテスト

おわりに

参考にさせていただいたサイトにも記述があるが、多言語の文字が正確に判定できる保証はないそうだが、日本語、英語の文字ならば利用可能とのこと。
フォントも多彩で、全角半角を数えてどこまで意味があるか疑問だが、参考になれば。

関連ページ

python-tkで、ファイルを選択する

(2020-05-14 初稿 - 2021-10-15 追記)

はじめに

筆者は、自分用の小さなスクリプトしか作らないので、普段はCUIスクリプトを作っている。
先日、同僚から依頼されたので、GUIでファイルを選択できるスクリプトをwebで検索したところ、まさに、どんぴしゃのすばらしいサイトが見つかったので、以下に紹介する。

なお、このページは、筆者の備忘録で、皆さんは上記サイトを参照してね。

スクリプト

あんまりマンマのコピペも失礼なので、変数宣言等少しだけ変更。

#!/usr/bin/env python3
#coding: UTF-8
# モジュールのインポート
import os
import tkinter as tk, tkinter.filedialog, tkinter.messagebox

# ファイル選択ダイアログの表示
root = tk.Tk()
root.withdraw()
ftype = [("","*")]
idir = os.path.abspath(os.path.dirname(__file__))
tk.messagebox.showinfo('○×プログラム','処理ファイルを選択してください!')

追加情報

上記サイトにも「おまけ情報」として記載があったが、こちらでも簡単に紹介する。

ファイルの種類の限定

ftyp = [("","*.pdf")]

複数ファイルの選択

# ここの1行を変更 askopenfilename → askopenfilenames
file = tkinter.filedialog.askopenfilenames(filetypes = ftype,initialdir = idir)

# 選択ファイルリスト作成

list = list(file)

おわりに

このような便利なGUIのパーツがあると、筆者もGUIスクリプトを作ってみたくなった。kinter 関連でスクリプトを組めば簡単なGUIものならばできそうだね。

(2021-10-15 追記)

以下のページにもっと簡単なZenityを使ったファイル選択のスクリプトを記載した。

参考までに

(追記終了)

関連ページ

python-tkで、Entryから複数の入力値を得るための最低限のスクリプト

(2020-05-11 初稿 - 2021-05-12 転記・修正 )

はじめに

pythonでユーザからGUIで入力を得るためには、tkinterのsimpledialogを用いると簡単である。
simpledialogは、入力が必要な場面のみダイアログが出るので、筆者のようにCUIをメインに作っている者にはありがたい。
以下は、参考サイト。

しかし、ユーザーから複数の入力を得たい場合は、simpledialog では何回も入力、改行を繰り返すことになってしまう。

そこで、シンプルで複数の入力が可能なダイアログを自作することにした。
もちろん、CUI好きな筆者なので、今回のスクリプトも一時的なGUIの利用で、ユーザからの入力値を得たらすぐにGUIを終了するものにした。

ところが、自作してみると、入力値を得ることが簡単ではなかった。
一つの解としては、入力値を受け取る変数をグローバル変数にするというのがある。

以下、参考サイト。

いろいろと試していると、グローバルな変数を使わなくても入力値を得ることができたので、備忘録としてメモを残す。

作成したスクリプト

前提条件が多く前置きが長くなったが、今回作成したスクリプトは、ディレクトリ名(dirname)とファイル名(fname)の2つ値を入力するダイアログである。

(2020-05-12 追記)
別の複数のtkを利用するスクリプトを作成したところ、ウィンドウが消えない現象がありプログラムを変更した。

【補足】
root.withdraw() で ウィンドウを消した状態に
root.deiconfy() で ウィンドウを表示

root.quit() guitした後のコードも実行
root.destroy() destroy後のコードは実行されない

#!/usr/bin/env python3
#coding: UTF-8
import sys
import tkinter

def ask_df():
    root = tkinter.Tk()
    root.withdraw() # 2020-05-12 追記
  
    root.title("Next Entry")
    root.geometry("400x120")
    # function
    def ok_get(event):
        root.quit()
        
    #ラベル
    label1 = tkinter.Label(text='Directory:')
    label2 = tkinter.Label(text='Filename:')
    label1.place(x = 20, y = 20)
    label2.place(x = 20, y = 50)
    
    #エントリー
    editbox1 = tkinter.Entry(width=40)
    editbox1.insert(tkinter.END,"Directory Name")
    editbox1.place(x=100, y=20)
    editbox2 = tkinter.Entry(width=40)
    editbox2.insert(tkinter.END,"File Name")
    editbox2.place(x=100, y=50)
    
    #ボタン
    button1 = tkinter.Button(text='OK')
    button1.bind("<Button-1>", ok_get)
    button1.place(x=300, y=80)

    # Enter でも OK
    root.bind('<Return>', ok_get)
    
    root.deiconfy() # 2020-05-12 追記
    root.mainloop()
    root.withdraw() # 2020-05-12 追記
    return editbox1.get(), editbox2.get()  # mainloop終了後 値return
    
if __name__ == "__main__":
    dir, fname = ask_df()
    print("Dirname:", dir)
    print("Filename:", fname)

 

f:id:hymd3a:20210512091438p:plain

作成したダイアログ

 

スクリプトの拡張

他のサイトに入力をクリアする方法の記載があったので、参考までに上記スクリプトに加えてみた。
いろいろなオプションやボタンをつける際の参考に。

#!/usr/bin/env python3
#coding: UTF-8

import sys
import tkinter

def ask_df():
    root = tkinter.Tk()
    root.withdraw() # 2020-05-12 追記
    root.title("Next Entry")
    root.geometry("400x120")
    
    # function
    def deletevalue(event):
        #エントリーの中身を削除
        editbox1.delete(0, tkinter.END)
        editbox2.delete(0, tkinter.END)
        
    def ok_get(event):
        root.quit()

    #ラベル
    label1 = tkinter.Label(text='Directory:')
    label2 = tkinter.Label(text='Filename:')
    label1.place(x = 20, y = 20)
    label2.place(x = 20, y = 50)
    
    #エントリー
    editbox1 = tkinter.Entry(width=40)
    editbox1.insert(tkinter.END,"Directory Name")
    editbox1.place(x=100, y=20)
    editbox2 = tkinter.Entry(width=40)
    editbox2.insert(tkinter.END,"File Name")
    editbox2.place(x=100, y=50)
    
    #ボタン
    button1 = tkinter.Button(text='OK')
    button1.bind("<Button-1>", ok_get)
    button1.place(x=300, y=80)
    button2 = tkinter.Button(text='Clear')
    button2.bind("<Button-1>", deletevalue)
    button2.place(x=200, y=80)
    
    # Enter でも OK
    root.bind('<Return>', ok_get)
    
    root.deiconfy() # 2020-05-12 追記
    root.mainloop()
    root.withdraw() # 2020-05-12 追記
    return editbox1.get(), editbox2.get()
    
if __name__ == "__main__":
    dir, fname = ask_df()
    print("Dirname:", dir)
    print("Filename:", fname)

f:id:hymd3a:20210512093034p:plain

作成したボタン付きのダイアログ

おわりに

筆者は、pythontkinterもど素人だが、使って覚えれば良いかなと考えている。
さらに、良い方法があったら、gmailのhymd3あてまで、教えてください。

関連ページ

python-tkで、ユーザからのシンプルな入力受付

(2020-05-17 初稿 - 2021-05-12 転記・追記)

はじめに

pythonスクリプトを作っていて、GUIでユーザから簡単な入力を受けたくなった。
Webを検索すると、そのものずばりの機能があった。
もともと、pythontkinterにあるスクリプトのよう。

このページは、以下のサイトを参考に、筆者の備忘録。

スクリプト

スクリプトは、上記サイトからいただいた。
とってもシンプルで、わかりやすく、また、スクリプトの中でも使いやすそう。

#!/usr/bin/env python3
#coding: UTF-8

import tkinter as tk
from tkinter import messagebox
import tkinter.simpledialog as simpledialog

root = tk.Tk()
root.withdraw() #ウィンドウを非表示

#simpledialog
inputdata = simpledialog.askstring("Input Box", "値を入力してください",)
print("simpledialog",inputdata)

おわりに

上記スクリプトは、シンプルなのに必要な機能は十分備わっている。
筆者は、2つの入力をしたかったので、以下のページに記載した。

興味のある方はご覧になって。

関連ページ

python CUIでキー入力

(2020-05-14 初稿 - 2021-05-12 転記・修正)

はじめに

筆者は、CUIで簡単なスクリプトしか作れない。^^;
しかし、入力を促してからすぐに入力を待たずして反応するスクリプトが欲しくwebを検索したら、以下のページがあったのでまずは紹介する。

上記サイトの中で、「そう、やりたいのは、かつてBASICでINKEY$というコマンドで実装していたように」とのくだりがあるが、これを読んだとき、「そう、これこれ」と思わず叫んでしまった。
INKEY$って懐かしいなぁ… 遠い目

早速、掲載されていたスクリプトを実行してみると、期待通りの動きに。
で、blessedはcursesライブラリを使いやすくしたラッパーとのこと、本家に行ってサンプルを見てみると、かなりのことができるよう。

スクリプト

以下の早速スクリプト。期待通りの動作でほんとに最高。
実際のスクリプトの中では、まだ使ったことはないが、これは役に立ちそう。

#!/usr/bin/env python3
#coding: UTF-8

from blessed import Terminal

t = Terminal()
with t.cbreak():
    while True:
        k = t.inkey(timeout=0.001)
        if not k :
            pass
        elif k.is_sequence:
            if k.name == 'KEY_ESCAPE':
                break
                print(f'"{k.name}"が押されました。終了するには「ESC」キーを押してください。')
            else:
                print(f'"{k}"が押されました。終了するには「ESC」キーを押してください。')

おわりに

pythonスクリプトもちょこちょこと作り、なんとなく馴染んできた。
いつも短いスクリプトしか作らないが、今度は少し長いスクリプトに挑戦してみようかな。

関連ページ

ひゃまだのblogインデックス

(2021-05-11 初稿 - 2026-03-27 追記)

はじめに

このサイトのページが20を超えるようになったので、一覧できるようにインデックスのページを設けた。

なお、以下のページは、筆者が管理する別ページになる。

本サイトのインデックス

Android関連

Arch Linux関連

Arduino関連

Bashスクリプト関連

Chromium関連

Docker関連

Equiptment関連

Github関連

Google Sites関連

Graphics関連

はてなBlog関連

Linux関連

M5Stack関連

Other関連

Powershell関連

Python関連

Raspberry Pi関連

Ruby関連

Small Talk(雑談)

Statistics(統計処理)関連

Vim関連

Web関連

Windows関連

WSL2関連