ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

2018年9月22日土曜日

【Python3】pythonの教科書(7) ~日本語対応

Pythonプログラミングで、ファイル内で日本語使うとエラーになります。

例えば、コンソールにつぎのようなメッセージが出力されます。
SyntaxError: Non-UTF-8 code starting with '\x82' in file C:\本山さん\ranking\ranking4.py on line 15, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

この場合には、
Pythonのスクリプトファイルの1行目もしくは2行目に「# coding: 文字コード」を記入します。
 ⇒ファイルで使われている文字コードを宣言し、Pythonに知らせることができます。
 「文字コード」の部分を「Shift_jis」にすればShift jisになりますし、「utf-8」にすればutf-8になります。

【参考URL】
http://programming-study.com/technology/python-japanese/

2018年9月9日日曜日

【Python3】pythonの教科書(6) ~コマンド引数、ファイル検索、os.path、クラス

1、コマンド引数、ファイル検索
コマンドライン引数を使用して、複数テキストファイルからテキストファイルを検索するサンプルです。

import sys
import os
if len(sys.argv) <= 1:  # sys.argvがコマンドライン引数
    print("pyファイルの後ろに引数(キーワード)を指定してください")
    sys.exit(0) # プログラムを終了する

keyword = sys.argv[1]
for root, dirs, files in os.walk("."):
    for fi in files:
        result = []

        try: #try-catchを使って、テキストファイル以外読み込んだ時のエラー防止
            path = os.path.join(root, fi)
            with open(path, encoding='utf-8') as f:
                for no, line in enumerate(f):
                    if line.find(keyword) >= 0:
                        line = line.strip()
                        s = "| {0:4}: {1}".format(no+1, line)
                        result.append(s)

        except:
            continue

       # resultに検索結果があれば結果を表示
        if len(result) > 0:
            print("+ file: " + fi)
            for li in result:
                print(li)


2、スクリプトパス
__file__でパス取得できます。
 
print __file__    # スクリプトファイルへの相対パス
print os.path.dirname(__file__) # スクリプトファイルのあるディレクトリへの相対パス
txt = os.path.join(os.path.dirname(__file__), 'input.txt') # スクリプトと同じディレクトリのファイル input.txt のパス
print txt 

print os.path.basename(__file__) # スクリプトファイル名
print os.path.abspath(__file__)  # スクリプトファイルの絶対パス

print os.getcwd()                # 実行時カレントディレクトリの絶対パス
 
 os.path にはいろいろな関数があります。
https://docs.python.jp/3/library/os.path.html
 

3、クラス
__init__が初期化関数になります。selfはインスタンス自身を表します。
  
class Clock:
    def __init__(self, hour, min, sec):
        self._hour = hour
        self._min = min
        self._sec = sec
    @property
    def hour(self):
        return self._hour

obj = Clock(11, 10, 0)
print(obj.hour) 

派生クラスは、次のように定義します。 
class 派生クラス名(基底クラス名):
  派生クラスの定義
 ...
 
派生クラスから基底クラスのメソッドを呼び出すには
super().基底クラスのメッソド()
と書きます。
 
メッソド名や変数名がアンダーバー(_)からはじまっていれば、 
非公開メソッド定義になります。
 
 
class Car:
    ''' 基底クラス '''
    def __init__(self, owner):
        self.car_type = "normal"
        self.owner = owner

   def show_status(self):
        ''' 状態を表示 '''
        print("owner:", self.owner)
        print("car_type:", self.car_type)
 
   def _test
        ''' 非公開メソッド''' 
        print("test.....") 

class Van(Car):
    ''' 派生クラス '''
    def __init__(self, owner):
        super().__init__(owner)
        self.car_type = "van"


【Python3】pythonの教科書(5) ~モジュール、ファイル読み書き

1、モジュール
(1)モジュールを取り込む
ファイル名がモジュール名となります。
モジュールを取り込む場合は、importを使います。
import モジュール名
hoge.pyというファイルを作った場合は、import hogeで取り込むことができます。

異なるパスにモジュールを配置した場合は、「ディレクトリの区切り」は"."で表します

(2) 標準モジュール
以下URLで確認できます。
https://docs.python.jp/3/py-modindex.html

(3)パッケージ管理ツール「pip」
パッケージ一覧登録「PyPI」(https://pypi.org/)は
 pip install パッケージ名
でインストールできます。
※pip uninstall パッケージ名、で削除できます
※インストールしたパッケージは、「c:\Users\ユーザ名\AppData\Local\Programs\Python\Python37-32(Pythonのバージョン名)\Lib\site-packages」に保存されます


2、ファイルの読み書き
①ファイルを開く open()
②ファイルを読み書きする read()/write()
③ファイルを閉じる close()

(1) ファイルの読込
test.txtファイルを読み込む例です。

a_file = open("test.txt", encoding="utf-8")
# 日本語読込の場合は、a_file = open("mt7_7_sjis.txt", encoding="sjis")
s = a_file.read()
a_file.close()


【ファイルを1行づつ読み込む場合】
また、with構文を使うと、close文を使わなくっても、自動的に処理の最後にclose文を実行してくれます。

key = "test"
with open("test.txt", encoding="utf-8") as tf:
    for i, line in enumerate(tf):
        # 文字列 key が行に含まれるか?
        if line.find(key) >= 0:
            print(i+1, ":", line)

(2) ファイルの書込
try-catchを使って、 test.txtファイルを書き込む例です。

a_file = open("test.txt", mode="w", encoding="utf-8")
try:
  a_file.write("test=\n今日は晴れです\n")
finally:

  a_file.close()

with構文を使って、ファイル書き込みを行います。

with open("test.txt", mode="w", encoding="utf-8") as f:
    f.write("test=\n今日は晴れです")


 (3) jsonファイルの読込/書込
import jsonを使用します。
①読込例
import json
filename = "test.json"
with open(filename, "r") as fp:
    r = json.load(fp)
    print("no=", r["no"])
    print("code=", r["code"])
    print("scr=", r["scr"])


②書込例
import json
# 辞書型のデータ(数値、タプル、文字列が使えます)
data = {
  "no": 1,
  "code": ("num", 1, 10),
  "scr": "test,test......",

filename = "test.json"
#オブジェクトをJSON文字列に変換
with open(filename, "w") as fp:
    json.dump(data, fp)

2018年9月2日日曜日

【Python3】pythonの教科書(4) ~無名関数、例外処理

1、無名関数
関数を定義しない関数のことで、lambdaを使います。
【例:xを2倍する無名関数】
y = lambda x : x *2  # y(x) : return x * 2 と同じ
y(2)
   ⇒(結果)4

【例: yに代入された関数オブジェクトをnumsの要素全てに実行してリスト化する 】
nums = [1, 3, 5, 7, 9]
y = lambda x : x *2
list(map(y, nums))
  ⇒(結果)[2. 6, 10, 14, 18]

【例: タプルのリストをソートする 】
tpl_list = [(1,2),(2,1),(3,0),(4,-5)]
ranking_list = sorted( tpl_list, key = lambda tpl : tpl[1], reverse=False)
print("+-------- rank (index, value)  ------+")
for i,v in enumerate(ranking_list) : print(i+1, v)
  ⇒(結果)+-------- rank (index, value)  ------+
               1 (4, -5)
               2 (3, 0)
               3 (2, 1)
               4 (1, 2)

2、例外処理
例:
s = input("Please input weight !")
try:
  v = 100 / float(s)
  print(v)
except ValueError as e:
  print(e)
except ZeroDivisionError as e:
  print(e)
except:
  print("another Error !!")
finally:
  print("end !!!")

エラーを発生させたいときは、 raiseを使用する
raise Exception("test Error ")


【Python3】pythonの教科書(3) ~データ(set/辞書/docstring/グローバル変数)

1、set
重複値を持つことができない
例: colors = { "red", "yellow", "green" }

2、辞書
例:
# 辞書型のデータ(果物名と値段)を変数に代入
fruits = { "バナナ": 300, "オレンジ": 240, "イチゴ": 350, "マンゴー": 400 }
# 辞書型のデータ一覧を表示
for name in fruits.keys():
    # 値段を得る
    price = fruits[name]
    # 画面に出力
    s = "{0}は、{1}円です。".format(name, price)
    print(s)

for name, price in fruits.items():
    s = "{0}は、{1}円です。".format(name, price)
    print(s)

・values()を使うと、値一覧を取得できる
・items()で、キーと値の一覧を取得できる
・sorted(d.keys())で、キー一覧をソート済みのリストで取得できる

【成績計算】
records = { 'Tanaka':72, 'Yamada':65, 'Hirata':100,'Akai':56, 'Fukuda':66, 'Sakai':80 }
# 合計を求める
sum_v = 0
for v in records.values():
    sum_v += v
print("合計点:", sum_v)


3、関数
(1) docstring
  関数の直下に三重引用符(''')の文字列を記述する。説明文をつける機能です。
 help(関数名)で確認できます。

【サンプル(動物での走行時間計算)】
# 動物の最高時速
animal_speed_dict = { "チーター": 110, "トナカイ": 80, "シマウマ": 60,  "ライオン": 58, "キ リ ン": 50,  "ラ ク ダ": 30}
# 東京から各都市までの距離
distance_dict = { "静  岡": 183.7,"名古屋": 350.6, "大  坂": 507.5}
def calc_time(dist, speed):
   ''' 時間を計算する '''
    t = dist / speed
    t = round(t, 1) # 四捨五入
    return t
def calc_animal(animal, speed):
   ''' 動物の各都市までの時間を計測する '''
    res = "|" + animal
    for city in sorted(distance_dict.keys()):
        dist = distance_dict[city]
        t = calc_time(dist, speed)
        res += "|{0:>6}".format(t) # 6文字を右寄せ(0は、format内の1番目の文字列)
    return res + "|"

print("+--------+------+------+------+")
print("|動物名前", end="")  # endは改行しないという意味
for city in sorted(distance_dict.keys()):
    print("|" + city, end="")
print("|")
print("+--------+------+------+------+")

for animal, speed in animal_speed_dict.items():
    s = calc_animal(animal, speed)
    print(s)
print("+--------+------+------+------+")

(2) グローバル変数
関数内でglobal宣言すると、グローバル変数の値変更可能となる
value =100
def changeValue()
  ''' valueをグローバル宣言 '''
  global value
  value =20

changeValue()
print("value=", value)
  →value =20となる(global valueを宣言しないと、100となる)

【Python3】pythonの教科書(2) ~type/pass/while/リスト/タプル

1、変数の型を調べる
type(変数や値)

2、if文で、何もしない場合
passを使用する
【例】
n = 5
if n == 3:
  pass
else:
  print(n)

3、プログラムの強制終了
[Ctrl]+[C] キー

4、while/for構文でのelseブロック
繰り返し条件が偽になった時に実行される
(繰り返しが1度も実行されない時、breakで途中終了されなかった時)

5、リスト
リストの例: a = [1,2,3,4]
                    len(a)
                    for i in a
                      print(v)
                    sum = sum(a)
                    a.append(5)
                    # インデックス番号、要素の値を出力
                    for i,v in enumerate(a)
                      print(i,v)
                  # 要素の追加
                  a += [6,7,8]
                    a .expand([9,10])

(1) リストのスライス
開始は0でなく、1となる(0から数えて1番目
・リスト[開始:終了]  // [:3]のように0は省略可能(末尾も同様)
・リスト[開始:終了:ステップ] 
・リスト[-2] //末尾から2個目の値

(2) リスト操作(以下の関数が使用できる)
appnd(x)
extend(x)
insert(i,x)
remove(x)
pop()
clear()
index(x)
count(x)
sort(key,reverse)   // reverse=Trueで降順ソート
copy()

6、タプル
リストと異なり、値が変更できません
リストの例: a = (1,2,3,4)
                     b=a[1]
                     c=[:2]

7、リストとタプルの変換
タプルからリスト変換:list(タプル)
リストからタプル変換:tuple(リスト)

【Python3】pythonの教科書(1) ~文字列に変換

pythonの教科書という本を買って、python3を勉強してみました。
(読みやすい本です。レビューでの評価もいいですね)
今後使えそうな内容(コード)などまとめてみました。

1、Python Sell(IDLE )の起動
・スタートメニューから「Python3.x」「IDLE」選択

もしくは、
・コマンドプロンプトで pythonを入力

2、コマンドラインからスクリプトファイル実行
スクリプトファイルダブルクリックでも実行できますが、
python3 スクリプト名.py
で実行します。

3、文字列
(1)数値を文字列に変換
str(数値)
⇒文字列を数値:int(文字列)、float(文字列)
(2) format()で値を埋め込む方法
"書式文字列".format(値,....)
【例】

inchi=24
cm =inchi * 2.54
desc ="{0}インチ={1}センチ".format(inch,cm)
print(desc)
(4) その他
・文字列の置換
 文字列.replace("検索語句","置換後の内容")
・英文字を単語に区切る
 文字列.split(区切り文字)
・lower()で文字列を小文字にする。upper()で大文字にする
・find(検索キーワード)で検索①を調べる
・spilt('区切り文字')で、分割する

2018年8月30日木曜日

【Python】Python3 インストール方法

Python3を使って、Pythonプログラミングを行うので、インストール方法をまとめてみました。

(1) Pythonをダウンロード
https://www.python.org/downloads/ ページでダウンロードする。
 ⇒今だと、Download Python 3.7.0 をクリックしてローカル保存する

(2)インストール
ダウンロードしたファイルをダブルクリックして、Add Python 3.6 to PAHT」にチェックを入れてから、「Install Now」をクリックし、インストールを開始させる。
インストールが完了したら、「Close」をクリックして、ウィンドウを閉じる。

(3) インストールの確認
(pythonの確認)
Windows のコマンドプロンプトを起動して、python を入力し、Enter キーを押す。
画面に「Python 3.6.3 on win32」が表示されれば、Python が正しくインストールされたことになる。
 ⇒Python2を使うときはpy -2コマンドを実行。Python3のときはpy -3を実行する。

(pipの確認)
コマンドプロンプトを起動して、pip --version を入力し、Enter キーを押す。
画面に「pip 9.x.x (Python 3.6)」のようなメッセージが表示されれば、インストールが正しく行われたことになる。

(4) python2がインストール済みの場合
python3を使いたい場合は、pathを変更する。(順番が重要!)



【参考URL】
https://bi.biopapyrus.jp/os/win/win-install-python.html
https://www.tech-tech.xyz/archives/3067595.html
http://windvoice.hatenablog.jp/entry/2018/05/02/150754

2018年8月5日日曜日

【Python】難読化

「Pythonの難読化」について、調べてみました。
方法は主に二つあるようです。
 
①Pythonの難読化ツールで行う
モジュール compileall か py_compile を使うと .pyファイルをコンパイルして .pycファイルを作成できる。
 
「python3 -m compileall [ファイル名] 」
で、同じ階層に "__pychache__" というディレクトリができる。
 
その中に、
[ファイル名].[Pythonのバージョン].pyc
というコンパイル済みファイルができので、
python3 [ファイル名].[Pythonのバージョン].pyc
で実行する。


②Pythonを他言語に変換してコンパイル
(1) Cythonで、PythonのコードをCに変換してコンパイルすることで高速化する
 
(2)  jythonを使い、 Pythonコードをjavaに翻訳して、バイトコードにコンパイルする
 

2014年9月18日木曜日

Pythonの学習(4)

(1) バージョン(2.x系と3.x系)
互換が無い。ソースコードの書き方に違いがある。
対応ライブラリの数
 2.x系の方が多いと思われる。3.x系は今後増えると思われる。
(2.xにある機能が3.xにない場合があるので、現状は2.xで開発する方がいいと思う)
パッケージの再構成
 3.xと2.xで標準ライブラリの中身も変わっているので、注意
print文の関数化
 3.x系からprint文が関数化されてます。

<2.x>
 print "test"

 obj = open("test.txt","w")
 print >> obj , "test" 
<3.x>
 print("test")

 obj = open("test.txt","w")
 print("test",file=obj) 

文字列の型
  2.x系の文字列の型は「unicode」と「str」の2種類が存在している。
  3.x系は、Unicodeへ統一された。

(2)クラス継承
クラスの作り方は、特に気にする点はないので、説明を省略します。
ここでは、継承の仕方を説明します。

「list」を継承してクラスを作成し、値が追加された際にprint出力する例です。
「__init__」は、クラスの初期化時に実行される関数となります。
第一引数の「self」は、クラスのインスタンス自身を表します。

class TestExtends(list):
    def __init__(self)
        list.__init__(self)

    def append(self,value): 
        list.append(self,value)
        print u"値が追加されました:" + str(value) 


(3)パッケージ化
パッケージの基礎 
パッケージのインポートをする際には「sys」モジュールの「path」内に記述されているディレクトリ配下にモジュールを置きます。

デフォルトのパス以外の場所に置きたい場合は、インポートを実行する前にパスを追加します。
例として、「c:/Python27/com」配下に「moto」を用意し、「plus_test」モジュールを作成します。
階層は下記の通りです。

 c:
   +--- Python27(ディレクトリ)
        +--- com(ディレクトリ)
             +--- moto(ディレクトリ)
                 +--- plus_test.py(モジュールファイル)

パッケージであると認識させるため、「__init__.py」というファイル名で初期化ファイルを用意し、それぞれのディレクトリへ配置します。「__init__.py」ファイルの中身は空で問題ありません。

 c:
   +--- Python27(ディレクトリ)
        +--- com(ディレクトリ)
        +--- __init__.py(初期化ファイル)
             +--- moto(ディレクトリ)
             +--- __init__.py(初期化ファイル)
                   +--- plus_test.py(モジュールファイル)
                   +--- __init__.py(初期化ファイル)

次のような感じです。


パッケージのインポート
 今回インポートを行う「plus_test」モジュールのコードは下記の通りとなります。
「c:/python/com/moto」ディレクトリに保存します。
ファイル名を指定して実行にて、「cmd」を入力して、DOS窓を開きます。
「cd c:\」でCディレクトリに移動します

 # -*- coding: utf-8 -*-

def plusValue(value_1,value_2):
    return value_1 + value_2

 続いてモジュールのインポートを行い「plusValue」関数を呼び出すコードを記載します。
例えば、以下のコードを記載して、[ライブラリ\ドキュメント]直下に保存します。

# -*- coding: utf-8 -*-
import sys

if __name__ == "__main__":

    sys.path.append("c:/Python27")      # パスの追加

    import com.moto.plus_test                  # パッケージのインポート
    print com.moto.plus_test.plusValue(1,1)   # 結果を出力

「パスの追加」にて、追加したパスをインタプリタが見てくれるようになります。
パッケージのインポートは、「 . 」(ドット)をセパレータとして使用し、対象のモジュールのインポートを行っています。
そして、モジュール内の「plusValue」関数を呼び出し、結果を取得・表示します。

以下が実際に実行した結果です。2が出力されていることがわかり。作成したモジュールが実行されていることが分かります。






 

2014年8月28日木曜日

Pythonの学習(3)


(1) Print文
・末尾に「,」(カンマ)を付与して出力をすると、改行されずに出力する
・ フォーマット出力 : 「%s」は文字列、「%d」は数値
・ファイル出力

  obj = open("test.txt","w") 
  print >> obj , "test test" 

(2) 例外処理
・try,except,finallyを使用する
・raiseを使ってエラーを発生させる(呼び出し元にエラーを返し、呼び出し元でエラー対応処理を行う)

 def calc(value_1,value_2):
    result = 0
    try:
        result = value_1 + value_2
    except:
        print "
エラー!"
        raise
    finally:
        print "終了"
    return result

def test(list_1,list_2):
    try:
        print calc(list_1[0],list_2[0])
        print calc(list_1[1],list_2[1])
        print calc(list_1[2],list_2[2])
    except:
        print "エラー発生!"


「raise」をコメントアウトするとtest関数のexcept配下の処理が実行されなくなります

エラー内容(スタックトレース)の取得
処理を実行中にエラーが発生すると、エラー内容(スタックトレース)が標準出力へ出力されますが、それを文字列で取りだす事も可能です。

     try:
        print test(100,"200")   ' "200"は文字列なのでエラーとなる
    except:
        print "--------------------------------------------"
        print traceback.format_exc(sys.exc_info()[2])
        print "--------------------------------------------"


(3)インポート
下のコードの自作モジュール「testpy」という名前で作業ディレクトリに保存する

------ test.py -----------------------
class tes_tclass:
    def __init__(self):
        print "create test_class"

    def test_method(self,str):
        print "call test_method"

        print str 
-----------------------------

    import test
    testclass1 = test.test_class()
        ' モジュール名.クラス名
    testclass1.test_method("1")         ' 「test_class」が保持している関数の呼出

    from test import test_class           '
「from」の後にモジュール名、「import」の後にクラス名
    testclass2 = test_class()              ' クラス名で直接使用出来
    testclass2.test_method("2")

2014年8月27日水曜日

Pythonの学習(2)



(1) エスケープシーケンス
シングルクォーテーション(')
  「\」をシングルクォーテーションの前に付加する。
  print '1234¥'567890'
ダブルクォーテーション(")
 「\」をダブルクォーテーションの前に付加する。
    print "1234¥"567890"
・バックスラッシュ(\)
  「\」を2つ続けて記述します。
   print "1234¥¥567890"
・改行
 「\n」と記述。
  print "1234¥n567890"
・タブ
 「\t」と記述します。
   print "1234¥t567890"

(2) if文
if分の例:
    if value_1 == "Python":
        pass
    elif value_1 == "python" and value_2 == "test":
        print "2番目がTrue"
    elif value_1 == "TEST" or value_2 == "PYTHON":
        print "3番目がTrue"


 ※「pass」は、何もしません」という命令で、この記述が無いとコードエラーとなります

(3) Switch文
 pythonではswitch-case文は存在しません。
if_elseで代用する。

(4) Range関数
・range(10) は (0,1,2,3,4,5,6,7,8,9)という内容のリストとなる
・range(2,10)は (2,3,4,5,6,7,8,9)という内容のリストとなる
・range(-2,10)は (-2,-1,0,1,2,3,4,5,6,7,8,9)という内容のリストとなる
 

2014年8月5日火曜日

Pythonの学習(1)

Pythonの勉強の始まりです。

参考URLは次となります。
Python-izm
http://www.python-izm.com/

ブログでは、文法等の基本事項は、除いて、私個人が気になったところを記述していきます。



(1) Pythonのバージョン
「2.x」と「3.x」があるが、互換性がありません(2.xで作成したものは、3.xで動きません)
 どちらがいいのかといえば3.xはまだ進化中ですので、2.xの方が良いと思います。

(2) プログラムの実行
Pythonのインタープリタ(python.exe)へパスが通っていない場合は、パスを通してから実行します。
パスを通したら、DOS窓からでも、pyファイルクリックでも実行できます。

(3) コメント
行頭の「#」(シャープ)を付けます。
複数のコメントアウトは、「'」(シングルクォーテーション)もしくは「"」(ダブルクォーテーション)3つでコメントアウトしたい部分を囲みます。
'''
print "test"
print "end"
'''

(4)文字列の取り扱い
・ 数値を文字列に変換
  val = 100
  print str(val) + "円"
         結果: 100円
・ 文字列の置換  name = "t.asano"
  print name.replace("t.", "m.")
         結果: m.asano
・ 文字列の分割
  val ="1,2,3,4"
    print val.spilt(",")
    結果: ['1', '2', '3', '4']
・ 文字列のゼロ埋め
   val = "1234"
     print val.rjust(10,"0")
         結果: "0000001234"
・ 文字列検索
  val = "asano"
    print val.startswith("asa")
         結果: Ttrue
・ 大文字小文字変換
  val = "T.asano"
    print val.upper()
    print val.lower()
        結果: T.ASANO t.asano

(5) 文字列を数値変換
  val = "100"
    print int(val) + 100
        結果: 200
※文字列100は変数に"100"で定義、数字は 100(""なし)で定義する。文字列と数字の足し算をしないことに注意

(6) タプル
 初期化後の変更が不可能ですので、共通で使用する関数などの返り値などに、使用する
 変更可能にした場合は、リストにします

(7) 算術子
インクリメント(++)、デクリメント(--)はありません

(8) コマンド引数
main内で、以下のように使います
param = sys.argv
print argv[0]

(9) プログラム終了
sysモジュールのexit関数を利用します。
import sys
sys.exit()