Pythonの覚書

python コンピュータ
python

Pythonでプログラミングするために学んだ内容を書き留めています。

エントリーポイント

Pythonはプログラムの開始位置となるエントリーポイントは無く、スクリプトに記述した順番に実行されます。

def func():
    print('hello world!')

if __name__ == '__main__':
    func()

if __name__ == '__main__':__name__には実行しているモジュール名が自動的にセットされており、'__main__'と比較することでスクリプトがモジュールで読み込まれているのでは無く単体で実行していることを判定しています。意図的に実行される部分をif文の中に限定することでエントリーポイントような役割にしています。

配列(list)の初期化

# listオブジェクトの生成で初期化
my_list1 = list()
print(my_list1) # 結果 []

# []で初期化
my_list2 = [0, 1, 2]
print(my_list2) # 結果 [0, 1, 2]

連想配列(dict)の初期化

a = {"aaa": 0, "ccc": 1, "ddd": 2}

テキストファイルを1行ごと読み込み

with open("sample.txt", "r") as f:
    for line in f:
        print(line.strip())

withを使うことでopenしたファイルfを閉じるコードを省略出来ます。
forfからレコード1行分をlineに取り出します。
lineには末尾に改行コードを含んでおりprint()も改行されて、改行が重複しますので、line.strip()で改行コードを取り除いています。

テキストファイルに1行ごと書き込み

data = ["apple", "banana", "orange", "grape"]

with open("output.txt", "w") as f:
    for item in data:
        f.write(item + "\n")

 

クラス

class SuperClass:
    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        self._name = value

    def sample_method(self):
        print("SuperClass.sample_method()")

class SubClass(SuperClass):  # SuperClassクラスを継承
    def __init__(self, name):
        super().__init__(name)  # 親クラスのコンストラクタを呼び出す

    def sample_method(self):  # メソッドのオーバーライド
        print("SubClass.sample_method()")

# インスタンスの生成
obj = SubClass("AAA")
# プロパティ
obj.name = "BBB"
print(obj.name) # 出力 BBB
# メソッド
obj.sample_method() # 出力 SubClass.sample_method()

コンストラクタ
def init(self, name):

メソッドの引数にself

正規表現で条件式

import re

pattern = r"img(\d+)\.png"
text = r"aimg001.png"

# search 文字列にパターンが含まれているか
if re.search(pattern, text):
    print("ok") # 出力 ok
else:
    print("ng")

# match 文字列の先頭からパターンに一致するか
if re.match(pattern, text):
    print("ok")
else:
    print("ng") # 出力 ng

正規表現で文字を抽出

import re

text = "私の電話番号は090-1234-5678です。"
pattern = r"(\d{3})-(\d{4})-(\d{4})"  # 電話番号のパターン
match = re.search(pattern, text)

if match:
    print(match.group(0))  # 一致した文字列全体を抽出
    # 出力: 090-1234-5678
    print(match.group(1))
    # 出力: 090
    print(match.group(2))
    # 出力: 1234
    print(match.group(3))
    # 出力: 5678
else:
    print("電話番号は見つかりませんでした。")

JSON

import json

data = [
    {"name": "田中", "city": "東京"},
    {"name": "若本", "city": "大阪"}
]

json_text = json.dumps(data, ensure_ascii=False)

print(json_text)
# 出力
# [{"name": "田中", "city": "東京"}, {"name": "若本", "city": "大阪"}]

data2 = json.loads(json_text)
print(data2[1]['city'])
# 出力
# 大阪

json.dumps()でobject⇒json(string)、json.loads()でjson⇒object

ディレクトリを作成

ディレクトリが存在しない場合複数階層を一度に作成。

import os
os.makedirs("./path/dirname", exist_ok=True)

ファイルの一覧を取得

import glob

for filename in glob.glob("./path/dirname/*.*"):
    print(filename)

パス文字列からファイル名を取得

import os

os.path.basename("./path/dirname/filename.txt")

パス文字列からディレクトリ名を取得

import os

dir_str = os.path.dirname("./path/dirname/filename.txt")

ファイル名からベース名と拡張子を取得

import os

array = os.path.splitext("filename.txt")

戻り値は配列が返る。最初の要素がベース名、次の要素が拡張子がセットされている。

ディレクトリとファイル名を結合しパス文字列を生成

import os

new_path = os.path.join("./path/dirname", "filename.txt"))

単純な文字列の結合と異なり、OSごとのディレクトリ記号の違いなどに対応する。

他のスクリプトファイルの関数の呼び出し

import my_module

my_module.func()

スクリプトファイルが同一ディレクトリに保存されていることが前提。

特定の関数のみインポート

from my_module import func, sub_action

func()

呼び出し時のモジュール名を省略できる

パスの有無を確認

import os;

os.path.exists("./path/dirname/filename.txt")

ファイルの有無
os.path.isfile()
ディレクトリの有無
os.path.isdir()

コマンドライン引数

import sys

# コマンドライン引数を表示
print(sys.argv)

# コマンドライン引数の数を表示
print(len(sys.argv))

# 特定のコマンドライン引数を取得
if len(sys.argv) > 1:
    print(sys.argv[1])

コメント

'''
これは複数行のコメントです。
複数行にわたって自由に記述できます。
'''
# 単行のコメント

コメント