sagantaf-佐賀んタフ-

なんでも自分の思ったこと、経験したことを書いて生きます。

【Python3】pyautoguiで日本語入力する方法

 
最近、pyautoguiを使って会社の業務を自動化しています。
 
そんな中、Webページに日本語を送って面倒な申請業務等を自動化しよう!
って思ったんですが、
作っていくうちに日本語入力ができない問題にぶち当たりました。。。
 
ググっても、やはりできないようで…
 
 
import pyautogui as auto
auto.typewrite("日本語送りたい”)
 
typewriteで英数字ならきちんと入力されるのに、日本語にした途端、何も入力されないんです。
 
 
なんとかならないものかと試行錯誤していたら、
 
コピペでできることが判明しました!
 
pyperclipモジュール と pyautoguiのhotkeyメソッド を利用します。
 
 
import pyautogui
import pyperclip
 
pyperclip.copy("これでいける")
pyautogui.hotkey('ctrl', 'v’)
 
 
 
こうすれば、上記のように直接書き込んでもOK、ファイルを読み込んでもOK、tkinterで入力した日本語を利用するでもOK、になります。
 
何度も利用する場合はメソッド化しておけば非常に便利です。
 
def copipe(string):
    paperclip.copy(string)
    pyautogui.hotkey('ctrl', 'v’)
 
 
 
すごい簡単な例ですが、以下のような使い方ができます。
import pyautogui
import pyperclip
 
input_string =input("何か日本語を入力してください:")
copipe(input_string)
 
 
 
 
 

Pythonで地球に引っ張られる力を計算するプログラムを作ってみた

 
物体同士が引っ張り合う力、万有引力
 
その計算式を元に、
 「地球からどのくらい離れたら、どのくらいの力が働くか」
を計算するプログラムをPythonで作成してみた。
 
入出力は次のようにしている。
 入力:物体の重さ(kg)
 出力:距離ごとの引っ張られる力(万有引力)の大きさのグラフ
 
万有引力の計算式は以下のようになる。
 
 F = G * ( m1 * m2 ) / ( r * 1000 )^2 
  F:万有引力(N)
  G:重力定数(N*m^2/kg^2)
  m1, m2:質量(kg)
  r:物体間の距離(km)
 
 
この式を地球との距離の計算として使う。
 
スタート地点は、地面から地球の中心までの距離である約6400kmとする。
約10倍離れることになる64000kmを最大距離とする。
グラフでのプロットは見やすさのために6400kmごとにする。
重力定数Gは 6.67 × 10^-11 である。
地球の重さは 5.972 × 10^24 kg である。
 
 
以下、コード例:
 
 

"""
万有引力の計算
F = G * (m1 * m2) / r^2
万有引力 = 重力定数G × (物体1の質量 × 物体2の質量) ÷ (物体間の距離)の2乗
"""


# グラフを描くためにmatplotlibをインポート
import matplotlib.pyplot as plt

 

# グラフを描くための関数
def draw_graph(x, y):
     plt.plot(x, y, marker="o")
     plt.title("Gravity force")
     plt.xlabel("Distance(km)")
     plt.ylabel("Gravitational force(N)")
     plt.show()

 

# 万有引力の計算をするための関数
def calculate_F():
     r = range(6400,64001,5000)
     F = [] # 一旦、万有引力Fを空リストで作っておく
     G = 6.672 * (10**-11) # 重力定数
     m1 = 5.972 * (10**24) # 地球の重さ

     

     # 以下で物体の重さを入力させる
     # floatに変換しているため、文字を入力するとエラー終了する
     m2 = float(input("Please enter mass:"))

 

     # 先ほどrangeで作成した距離のリストrを一つずつ取り出して、forceとして万有引力を計算
     for distance in r:
          force = G*(m1*m2)/((distance*1000)**2)
          F.append(force) # 作成しておいたリストFにひとつずつ追加(append)していく

     

     #グラフを描画

     draw_graph(r, F)

 

# メイン関数
if __name__ == '__main__':

     calculate_F()

 
 
 
たとえば、
60kgの人の体重を入力すると以下のようなグラフになる。

f:id:sagantaf:20171012222413p:plain

 
 
地上では600N近くの力が働いているが、高度約3600km(※)だと3分の1である200Nになっている。
(※ 地球の中心から10000kmは地上から3600kmになるので)
 
つまり、体感で体重が20kgになっているということになる。
 
ちなみに高度3600kmというと、人工衛星ISS(高度400km)よりも遥か高いところになる…
 
 
 
 

【Python3入門まとめ】3.文字列

 

要約

 

文字列

・文字列はダブルクオート( “ )もしくはシングルクオート( ' )で囲む
エスケープ処理は¥もしくは\をつかうか、” と ’ を組み合わせることで可能
・改行とタブは\nと\tで実現可能
・文字列の結合、繰り返し、抽出は、+、*、をつかう
はスライス処理といい、[2:4:2]、[:-1:2]といった使い方が可能
 
 
 

詳細と実行例

(具体例の中の赤字は、説明です。実際に打ち込むコマンドではありません。)
 
 
超基本
ダブルクオート( “ )もしくはシングルクオート( ' )で囲むと文字列として扱われる。
>>> "hello"
'hello'
>>> 'hello'
'hello'
>>>
>>> a = “hello"
>>> a
'hello'
>>> print(a)
hello
 
  
クオートが無い場合は変数として判断され、宣言していないのでエラーになる。
>>> hello
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'hello' is not defined
>>> 
 
 
 
スケープ文字を入れて記号や改行を文字列に入れる
文字列の中でダブルクオート( “ )もしくはシングルクオート( ' )を利用したい場合は、¥もしくは\エスケープする。’を使いたいときは、”で文字を囲む、といった方法でもエスケープ可能。
>>> 'I'm Japanese.'
  File "<stdin>", line 1
    'I'm Japanese.'
       ^
SyntaxError: invalid syntax
>>>
>>> 'I\'m Japanese.’     ←コードの中にあると、少し読みにくくなってしまう。
"I'm Japanese."
>>>
>>> "I'm Japanese.”     ←”と’を組み合わせることで、見え方がそのままになり読みやすい。
"I'm Japanese."
>>> 'This is "Sushi"!'
'This is "Sushi"!'
>>> 
 
コードが長くなってくると、ひとつひとつの読みやすさ、理解のしやすさは重要になってくる。その点で、文字列宣言において”と’のどちらも利用できるようになっているのは、Pythonのとても便利な点。 
 
 
 
文字列の中に改行を入れたい場合は、\nを利用するか、””"で文字列を囲めばよい。
>>> x = "line1\nline2\nline3"
>>> print(x)
line1
line2
line3
>>> 
>>> y = """abc
... efg
... hij"""
>>> print(y)     ←print関数だと\nが改行として処理される
abc
efg
hij
>>> y     ←一方で自動エコー機能を使うと、\nはそのまま表示される
‘abc\nefg\nhij 
 
 
 
タブを入れたい場合は、\tを利用する。
>>> print("abc\tefg”)
abc    efg
 
 
いちいちエスケープをつけるのが面倒な場合は、文字列を表現する前にrをつけることで、エスケープ不要になる。 
>>> path = r"C:\home\name"
>>> print(path)
C:\home\name
>>>
 
 
 
文字列をいろいろいじる(結合、繰り返し、抽出)
文字列を結合するには、+をつかう。
>>> s1 = "hello"
>>> s2 = "world"
>>> s1 + s2
'helloworld'
 
 
繰り返し表示するには、*をつかう。
>>> "hello " *10
'hello hello hello hello hello hello hello hello hello hello '
>>>
>>> 2 * “Hi”     ←前後どちらに数値をもってきてもOK
‘HiHi'
 
 
 
文字列は[]を使って抽出できる。(スライス処理)
>>> s = "String"
>>> s[0]
'S'
>>> s[3]
‘i'
 
 
マイナスをつけると文字列の後ろから数えて抽出してくれる。 
>>> s = "qwertyuiopasdfghjkl"
>>> s[-3]
'j'
>>> s[-0]     ←[-0]は[0]と同じと判断される。
‘q'
>>> s[-1]     ←一番後ろの文字を抽出したい時は[-1]となることに注意。
'l'
 
  
マイナスをつかうことで、なが〜い文字列のときに文字数を数える手間が省ける。
(真ん中の方の文字を抽出したいときは数えないといけないけど…。簡単な文字数の表示方法は後述)
 
 
[X:Y:Z]で位置を利用した表現もできる。
これは、”X以上Y未満の数値をZステップで文字列をとりだす”という意味をあらわす。
ステップ数とは、飛び飛びに値を抽出することを意味する。2つ飛びにとか5つ飛びにとか。
>>> s = "abcdef"
>>> s[0:3]
‘abc'
>>> s[2:-2]
'cd'
>>> s[0:5:2]     ←ひたつ飛びなので、0番目・2番目・4番目の文字列を取り出し
'ace'
 
 
X、Y、Zはそれぞれ省略できる。
XとYは省略したら、最初からもしくは最後までと判断される。
>>> s = "abcdef"
>>> s[:4]     ←最初から3番目までの文字列をひとつ飛びに取り出す
'abcd'
>>> s[4:]    ←4番目から最後までの文字列をひとつ飛びに取り出す
‘ef'
>>> s[:]     ←最初から最後までの文字列をひとつ飛びに取り出す=そのまま表示(つかう機会はない…)
'abcdef'
>>> 
 
 
 
ステップに−1を指定した場合、文字列を逆から順に取り出していくことになるので、文字列を反転できる。
>>> s
'abcdef'
>>> s[::-1]
'fedcba'
>>> 
 
 
文字列検索
in を使うことでbool型としてTrueもしくはFalseの判定をしてくれる。
このとき、大文字小文字の区別までしてくれる。
>>> "e" in "Hello"
True
>>> type("e" in "Hello")
<type 'bool’>     ←タイプがboolになっていることがわかる
>>> 
>>> "world" in "hello world"
True
>>> "world" in "hello World"
False
 
文字列検索に利用することができる。
 
 
 
 
 
 
 

【Python3入門まとめ】2.変数

 

要約

 

変数

・変数の宣言は = を使う。
・型 (int, float, strなど) は自動的に判断される。
・変数は2回同じものを宣言すると上書きされる。
・宣言していない変数を呼ぶとエラーになる。
・数値から始まる変数や、Pythonで予約されている言語を利用した変数は宣言できない。
 
 
 

詳細と実行例

(具体例の中の赤字は、説明です。実際に打ち込むコマンドではありません。)
 
変数の宣言は = を使う。
型(int, float, strなど)は自動的に判断される。
>>> num = 10     ←変数numに数値10を格納
>>> num
10
>>> type(num)     ←型(タイプ)を確認すると int になっている
<class 'int'>
>>>
>>> var = "hello"
>>> type(var)     ←文字列を格納すると str になっている
<class 'str'>
>>> var
'hello'
 
 
変数は上書きされる。
>>> num
10
>>> num = 20
>>> num
20
 
 
宣言していない変数を呼ぶと、当然ながらエラーになる。
>>> bum
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'bum' is not defined
 
 
数値から始まる変数や、Pythonで予約されている言語を利用した変数は宣言できない。
>>> x1 = 1
>>> x_1 = 2
>>> 1x = 2     ←数値から始まる変数を宣言すると invalid syntax エラーとなる
  File "<stdin>", line 1
    1x = 2
     ^
SyntaxError: invalid syntax
>>>
>>> break = 3    ←breakはif文で利用するため、Pythonで予約されている
  File "<stdin>", line 1
    break = 3
          ^
SyntaxError: invalid syntax
>>> 
>>> bread = 3     ←breakは予約語だからエラーになるが、breadは予約されていないので問題なく宣言できる
>>> bread
3
 
 

AstropyでFITSデータを読み込んで表示させる方法

 
 
天文データの解析をやってみたい、と思い、
まずは天文画像をPythonに取り込み、表示させるにはどうするか、調べて実践してみた。
 
 

天文データはFITS形式

 
天文データはFITSというファイル形式で扱われることが多いらしい。
 
 
PythonでFITSファイルを扱うには、astropyというライブラリを使う。
 
 
最初に調べた時は、pyfits というライブラリが使われている例が多く見つかったので、インストールして、公式ページ(http://www.stsci.edu/institute/software_hardware/pyfits(英文))を読んでみたら、もう開発していないとのこと。。。
現在はastropyに移行されており、pyfitsは利用非推奨になっていた。
 
 
 
Astropyとmatplotlibを使って天文画像を表示
 
ということでまずはastropyをインストール
 
$ pip install astropy
 
 
FITSファイルのサンプルをネットで探して、sample.fitsという名前に変更しておいた。
 
そのダウンロードしたファイルがある場所で、インタラクティブシェルに入り、astropyを使ってみる。
 
 
以下のページがまとまっていたので、参考にしながら実践:
Astro : 解析によく使う python モジュール/関数
 
 
 
 
①まずはそれぞれ利用するライブラリをimportする
$ python3
>>> import astropy.io.fits as iofits
>>> import matplotlib.pyplot as plt
 
 
②ファイルをopen()で開く。
>>> list = iofits.open("sample.fits")
>>> list
[<astropy.io.fits.hdu.image.PrimaryHDU object at 0x10a4c6cc0>, <astropy.io.fits.hdu.table.TableHDU object at 0x10a4cdf98>]    
 
↑imageとtableがリスト形式で格納されていることがわかる。
 
 
③imageを使って表示させるため、リストの0番目の要素だけ取り出す。
>>> pic = list[0]
 
 
④FITSファイルにはヘッダ部とデータ部があるため、分けておく必要がある。
>>> header = pic.header
>>> data = pic.data
 print(header) とするとヘッダ部の中身を確認することができる。
 
 
⑤imshow()で表示させたい画像(data)を認識させ、show()で表示させる。
>>> plt.imshow(data)
<matplotlib.image.AxesImage object at 0x10a2fd9b0>
>>> plt.show()
 
これで画像が表示される。
 
 
 
APLpyライブラリで画像表示
 
matplotlibと同じくaplpyでも画像を表示することができる。 
 
 
まずはインストール。
$ pip install aplpy
 
 
①利用するライブラリをimport
>>> import astropy.io.fits as iofits
>>> import aplpy
 
 
②ファイルを開くところまでは同じ。 
>>> file = iofits.open("sample.fits") 
 
 
③FITSFigure()を使って画像として認識させ、show_colorscalse()でカラーで表示させることを指定する。
>>> pic = aplpy.FITSFigure(file)
>>> pic.show_colorscale()
>>> plt.show()
 
show_grayscale()を利用することで白黒で画像を表示させることも可能。
 
 
以上!
今回はただ天文データを表示させただけ…
 
実際に天文データ解析は、本やらネットやらを探して、やっていきたいところ。
 
 
 
 
 

ユーザ入力を数値に置き換えるときにint, float, Fraction のうち何に軍配があがるか。 in Python

Python お勉強中。

そんな中、

ばっと思いついたのでメモ。

 

以下の文字列がinput()で入力されたとして、それぞれをint, float, Fraction(分数)に変換してみる。

>>> s1 ="2"

>>> s2 = "2.3"

>>> s3 = "2/5"

 

まずはint(整数型)変換から。

>>> int(s1)

2

>>> int(s2)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: invalid literal for int() with base 10: '2.3'

>>> int(s3)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: invalid literal for int() with base 10: '2/5'

 

見事に後ろ二つはエラーになってしまった。

1勝2敗!

 

さて次は、float(浮動小数点型)変換。

 

>>> float(s1)

2.0

>>> float(s2)

2.3

>>> float(s3)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: could not convert string to float: '2/5'

 

2勝1敗!

分数の形のものをよしなに小数へ変換はしてくれないみたい。

 

最後は分数(Fraction)変換。

 

>>> Fraction(s3)

Fraction(2, 5)

>>> Fraction(s1)

Fraction(2, 1)

>>> Fraction(s2)

Fraction(23, 10)

 

見事3勝!

小数も分数に変換してくれた!

 

 

ということでFractionに軍配が上がりました〜!

Fractionなら、整数っぽい文字列も、小数っぽい文字列も、分数っぽい文字列も全部、分数の形に変換してくれる。

 

つまり、とりあえずFractionに変換して、あとから希望の型に変換すればよいことになる。

↓こんな感じで。

>>> int(Fraction(s2))

2

>>> int(Fraction(s3))

0

>>> float(Fraction(s3))

0.4

 

一つ目は int(float(s2)) でも実現できる。

まあ、小数や分数を整数に変換したいときはあまりないかもだけど。。。

 

注意)Fractionを使うには事前にfractionsモジュールからFractionクラスをインポートしておく必要があり。

>>> from fractions import Fraction

 

 

複素数への変換はどうやるんだろう。。。

うまい方法が思いつかない。。。

ググってもでてこない。。。

【Python】単位変換機を作成してみた

 引き続き、「Pythonから始める数学入門」の問題をアレンジして、実際に作成していきます。
 
今回は、単位変換に関する問題です。
 
問題1−3 単位変換プログラムの拡張
 
「質量単位の変換(kgーlb(ポンド))と温度単位の変換(℃ー°F)ができるようにせよ。」
 
 
これをアレンジして、以下のように汎用的にしてみました。
 
「最初に単位変換のメニューを用意して、実施したい単位変換を選択できるようにせよ。その後、数値を入力できるようにし、実際に変換結果を表示せよ。」
 
メニューは、
 ・インチとメートル
 ・グラムとポンド
 ・華氏と摂氏
にしました。
 
 
def unit_change(menu):
    if menu == 1:
        orig = input("Please enter the distance you want to convert:")
        while True:
            try:
                orig = float(orig)
                break
            except ValueError:
                print("Please enter an number.")
 
        meter = orig * 0.0254
        inch = orig / 0.0254
        print("{0} inch -> {1} meter".format(orig,meter))
        print("{0} meter -> {1} inch".format(orig,inch))
 
    elif menu == 2:
        orig = input("Please enter the weight you want to convert:")
        while True:
            try:
                orig = float(orig)
                break
            except ValueError:
                print("Please enter an number.")
        gram = orig * 0.0454
        pond = orig / 0.0454
        print("{0} pond -> {1} gram".format(orig,gram))
        print("{0} gram -> {1} pond".format(orig,pond))
 
    elif menu == 3:
        orig = input("Please enter the temperature you want to convert:")
        while True:
            try:
                orig = float(orig)
                break
            except ValueError:
                print("Please enter an number.")
        F = orig * 3.4
        C = orig / 3.4
        print("{0} ℃ -> {1} ℉".format(orig,F))
        print("{0} ℉ -> {1} ℃".format(orig,C))
 
    else:
        print("unknows error occurred!")
 
 
if __name__ == '__main__':
    dict = {1:"distance", 2:"weight", 3:"temperature"}
    print("Please chose an unit which you want to convert.")
 
    while True:
        for k,v in dict.items():
            print("  {0}:{1}".format(k, v)) #menuを表示
 
        m = input("Enter an number:")
 
        try:
            m = int(m)
            if m in list(dict.keys()):
                break
            else:
                print("Plese choose the menu number.")
        except ValueError:
            print("Please enter an number.")
 
    unit_change(m)