Python3.11 チュートリアル 6: 標準ライブラリの概要 1 - os、shutil、sys、random、time、datetime、threading

参考:Python3.11公式チュートリアル「標準ライブラリ入門」Python標準ライブラリ公式ドキュメント

  Python の標準ライブラリは、さまざまな一般的なタスクや操作を実行するために Python プログラミング言語によって提供される一連の組み込みモジュールと関数です。これらのモジュールと関数は広く使用されており、ファイル操作、テキスト処理、ネットワーク通信、数学的計算、日付と時刻の処理、マルチスレッド プログラミングなどの多くの機能を提供します。いくつかの主要なモジュールを以下に紹介します。

1. ファイルおよびディレクトリ処理モジュール

ファイルとディレクトリの処理に関連する Python 標準ライブラリのいくつかのモジュールは次のとおりです。

モジュール名 機能説明
os ファイルやディレクトリの操作、環境変数など、オペレーティング システムと対話するための機能を提供します。
os.path パスの結合、分割、ファイルが存在するかどうかのチェックなど、ファイル パスを処理するための機能を提供します。
shutil ファイルやディレクトリのコピー、移動、削除、ファイルのアクセス許可の設定など、高度なファイル操作に使用されます。
glob 特定のパターンに一致するファイル パスを検索するために使用され、ワイルドカード一致をサポートします。
stat ファイルサイズや変更時刻など、ファイルやディレクトリの属性を取得する機能を提供します。

1.1 OSモジュール

  os モジュールは Python の標準ライブラリの 1 つで、オペレーティング システムと対話するための機能を提供します。ファイル システム、ディレクトリ、ファイル パスなどに関連する操作を実行できます。関連するチュートリアルについては、別の投稿「Python 3.11 チュートリアル 3: モジュールとパッケージ (pip/conda)、ファイル システム (os/ shutil/json/ pickle)」を参照してください。 /openpyxl/xlrd)》第8.4章。

1.2 シュティルモジュール

shutil モジュールは、ファイルおよびディレクトリ操作のための Python 標準ライブラリの強力なツールです。ファイルやディレクトリのコピー、移動、削除、およびさまざまなファイル操作タスクの実行に使用できる多くの関数が提供されています。関連するチュートリアルについては、別の投稿「Python3.11 チュートリアル 3: モジュールとパッケージ (pip/conda)、ファイル」を参照してください。システム(os/shutil/json/pickle/openpyxl/xlrd)》 8.5章。

1.3 ファイルのワイルドカード グロブ

  globこのモジュールは、ファイルとディレクトリのパスを検索するために、特に指定されたディレクトリ内で特定のパターンに一致するファイルを検索するために使用されます。その主な検索機能は でglob.glob()、構文は次のとおりです。

glob.glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)
  • pathname: 検索パターン。一致するファイル名またはパスを示す文字列 (ワイルドカード文字*および を含む) にすることができます。?たとえば、 で終わる*.txtすべてのファイルを照合できます。.txt

  • root_dir(オプションのパラメータ): 検索のルート ディレクトリを指定します。デフォルトでは、検索は現在のディレクトリで実行されます。

  • dir_fd(オプションのパラメータ): 指定されたファイル記述子 (File Descriptor) で表されるディレクトリ内での検索を示します。

  • recursive(オプションのパラメータ): デフォルトではFalse、指定されたディレクトリ内で一致するもののみを検索します。に設定するとTrue、サブディレクトリ内のファイルとディレクトリが再帰的に検索されます。

  • include_hidden(オプションのパラメータ): デフォルトではFalse、 に設定するとTrue、ドットで始まる隠しファイルとディレクトリが検索されます。

*任意の文字シーケンスと一致するか、?単一の文字と一致します。

import glob

txt_files = glob.glob("*.txt")					# 查找所有以 .txt 结尾的文件
ata_files = glob.glob("data*")					# 查找所有以 data 开头的文件
numbered_files = glob.glob("*[0-9]*")			# 文件名中含有数字的文件

# 匹配以 file 开头,后跟一个数字和一个字符,最后以 .txt 结尾的文件,如 file1.txt、fileA.txt,但不匹配 file10.txt。
file[0-9]?.txt									

os モジュールと正規表現を使用してファイルを照合することもできます。

import os
import re

# 要匹配的目录和正则表达式模式
directory = '/path/to/your/directory'
pattern = r'my_pattern_\d+\.txt'  # 例如,匹配 "my_pattern_123.txt"

# 使用正则表达式编译模式
regex = re.compile(pattern)

# 遍历目录中的文件和子目录
for filename in os.listdir(directory):
    # 使用正则表达式匹配文件名
    if regex.match(filename):
        # 匹配成功,输出文件名或执行其他操作
        print(filename)

1.4 ステータス

  Python では、statモジュール ( os.statmodule) は、ファイルとディレクトリの属性を取得するために使用されるモジュールです。ファイル サイズ、変更時刻、アクセス許可などのファイル メタデータを取得できます。このメタデータ情報は、ファイルとディレクトリの管理と操作にとって非常に重要です。

  stat モジュールの一般的に使用される関数は os.stat(path) で、パスのファイルまたはディレクトリの属性情報を指定するために使用されます。最後に、さまざまなメタデータを含む名前付きタプルを返します。その主な属性は次のとおりです。

属性 説明する
st_mode ファイルのモード (アクセス許可) (ファイル タイプとアクセス許可フラグを含む)。
st_size ファイルのサイズ (バイト単位)。
st_atime ファイルの最終アクセス時刻 (タイムスタンプ)。
st_mtime ファイルの最終変更時刻 (タイムスタンプ)。
st_ctime ファイルの作成時刻 (タイムスタンプ)。
st_blocks ファイルが占有しているブロックの数 (Unix/Linux ファイル システムのブロック サイズ)。
st_uid ファイルのユーザー識別子 (ユーザー所有者)。
st_gid ファイルのグループ識別子 (グループ所有者)。

簡単な例を次に示します。

import os
import stat
import time

file_path = '/path/to/your/file.txt'
file_stat = os.stat(file_path)					# 获取文件属性信息

file_size = file_stat[stat.ST_SIZE]				# 获取文件大小(以字节为单位)
print(f"File size: {
      
      file_size} bytes")

# 获取文件最后修改时间并格式化为可读日期时间
file_mtime = file_stat[stat.ST_MTIME]
formatted_mtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(file_mtime))
print(f"Last modified time: {
      
      formatted_mtime}")

file_stat 
File size: 103368 bytes
Last modified time: 2023-09-08 22:19:49
os.stat_result(st_mode=33206, st_ino=1125899907060471, st_dev=4277431046, st_nlink=1, 
st_uid=0, st_gid=0, st_size=103368, st_atime=1694182789, st_mtime=1694182789, st_ctime=1694045176)

2.sysモジュール

  sysモジュールは Python 標準ライブラリの一部であり、これを使用すると、Python インタープリタと対話し、システム関連情報にアクセスできます。このモジュールは、コマンド ライン引数、オペレーティング システム固有の関数を処理し、Python インタープリターの動作を制御するのに役立ちます。sysモジュールの主な機能を以下に紹介します。

関数/コマンド 説明する
sys.argv スクリプト名を含むコマンドライン引数のリスト。
sys.exit([arg]) プログラムを終了します。オプションのパラメータ arg は、終了時の戻り値を指定するために使用されます。
sys.path モジュール検索パスのリストが含まれます。
sys.modules ロードされたモジュールを含むディクショナリ。キーとしてモジュール名、値としてモジュール オブジェクトを持ちます。
sys.platform 現在のオペレーティング システム プラットフォームの名前を返します (「win32」、「linux」など)。
sys.version Python インタープリターのバージョン情報を返します。

ここではいくつかの例を示します。

import sys

# 假设你运行脚本时输入了以下命令:python myscript.py arg1 arg2
print("命令行参数:", sys.argv)  		# 输出:['myscript.py', 'arg1', 'arg2']
import sys

def main():
    # 一些程序逻辑...
    if something_wrong:
        print("发生错误")
        sys.exit(1)  				# 退出程序,并返回退出状态码1

if __name__ == "__main__":
    main()

2.1 コマンドラインパラメータリスト

  コマンド ラインで Python スクリプトを実行すると、Python インタープリタは入力したコマンド ライン情報をリストに変換します。このリストは「コマンド ライン引数リスト」と呼ばれます。このリストには、スクリプトの名前やその他のパラメータなど、いくつかの役立つ情報が含まれています。

  というscript.py名前の Python スクリプトがあるとします。コマンド ラインに入力するとpython script.py arg1 arg2、Python インタープリタは内容をリストに変換し、sysモジュールの変数に保存します。次のアクセスにargv使用できます。sys.argv

import sys

# 获取命令行参数列表
sys.argv
['script.py', 'arg1', 'arg2']    # 脚本名、多个参数名

-cまたは など  の特別なオプションを使用すると、-mPython はリストに追加情報を提供します。たとえば、次のコマンドを実行すると:

python -c "print('Hello, world!')"

リストは次のようになります。

['-c', "print('Hello, world!')"]

  これは、オプションが使用され-c、実行されるコードが であったことがわかります"print('Hello, world!')"オプションが使用されている場合は-m modulesys.argv[0]パスを含むモジュールの完全な名前。

2.2 -c および -m オプション

  -cと は-mPython インタープリターのコマンド ライン オプションで、前者はコード行を実行するために使用され、後者は指定されたモジュールを実行するために使用されます。

  • -cオプション:

  -c commendこのオプションを使用すると、コマンド ラインから Python コードの行を実行できます。これは、完全なスクリプト ファイルを作成せずに、いくつかの単純な操作をすばやく実行する必要がある場合に便利です。実行するコードは引用符で囲むことができます (Python ステートメントには、シェルによって特別に処理されるスペースやその他の文字が含まれることが多いため、通常はコマンド全体を引用符で囲むことをお勧めします)。以下に簡単な例をいくつか示します。

  1. 簡単な計算
python -c "print(10 + 20)"
  1. 複数行のコード ブロック: 複数行のコードを 1 行で記述することもできます。コードを次のように区切ります;
python -c "x = 5; y = 10; print(x + y)"
  1. モジュールの使用: time モジュールなどの Python の組み込みモジュールをインポートして使用できます。
python -c "import time; print(time.strftime('%Y-%m-%d'))"
  1. リストを作成します。
python -c "my_list = [1, 2, 3]; doubled = [x * 2 for x in my_list]; print(doubled)"
  1. 条件文
python -c "x = 15; y = 10; print('x is greater' if x > y else 'y is greater')"
  • -mオプション

  -m modulesys.path指定されたモジュールが検索され、__main__その内容がモジュールとして実行されることを示します。module は、ファイル拡張子 (.py) を除いたモジュール名です。多くの標準ライブラリ モジュールには、timeit モジュールなど、実行時にスクリプト化して呼び出すことができるコードが含まれています。

python -m timeit -s 'setup here' 'benchmarked code here'
python -m timeit -h # for details

モジュールへのパスを追加で指定することもできます。

# 运行my_package 包中的模块my_module
python -m my_package.my_module

この部分の詳細については、「コマンドラインと環境」を参照してください。

2.3 引数解析

  argparse モジュールは、コマンド ライン引数を処理するためのより複雑なメカニズムを提供し、コマンド ライン ツールとスクリプトの作成に役立ち、ユーザーがプログラムを簡単に構成して実行できるようにします。

2.3.1 argparse 使用ロジック

一般に、argparse を使用する手順は次のとおりです。

  1. argparseモジュールをインポートする

  2. クラスを使用してargparse.ArgumentParserコマンド ライン パーサー オブジェクトを作成しますこのオブジェクトは、コマンド ライン引数の定義と解析に使用されます。descriptionユーザーがコマンド ライン ツールの使用方法を理解できるように、パラメーターにパーサーの短い説明を入力できます

    parser = argparse.ArgumentParser(description='描述解析器的用途')
    
  3. コマンド ライン パラメーターの定義を追加する:parser.add_argumentメソッドを使用して、解析する必要があるコマンド ライン パラメーターを追加します。これには、位置パラメータ、オプションのパラメータ、フラグが含まれます。パラメータ名、データ型、デフォルト値などの情報を指定する必要があります。

    # 添加了一个名为 `--option` 的可选参数,它是整数类型,有默认为0,并提供了帮助信息。
    parser.add_argument('--option', type=int, default=0, help='可选参数的描述')
    
  4. コマンドライン引数を解析して保存します

    # 使用parser.parse_args() 方法来解析从命令行传递的参数,并将结果存储在变量中。
    args = parser.parse_args()
    
  5. パラメータ値の操作:argsオブジェクトから解析されたパラメータ値にアクセスし、プログラムでそれらを使用できます。

    option_value = args.option
    
  6. プログラム ロジックを完成する: 最後に、解析されたパラメーター値に基づいてプログラム ロジックを実行します。パラメータに応じて、さまざまなアクションを実行できます。

Yolov5 はターゲット検出用の深層学習モデルであり、通常、 または などのメイン スクリプトが  あり、 argparse を使用してパラメータを設定しますtrain.pydetect.py以下に、これらのパラメーターを使用して検出を開始する方法を示します。

# detect.py
import argparse

def parse_args():
    parser = argparse.ArgumentParser(description="Yolov5 目标检测")
    
    # 模型参数
    parser.add_argument('--model', type=str, default='yolov5s', help='模型类型 (yolov5s, yolov5m, yolov5l, yolov5x)')
    
    # 输入图像参数
    parser.add_argument('--image', type=str, default='input.jpg', help='输入图像路径')
    
    # 输出参数
    parser.add_argument('--output', type=str, default='output.jpg', help='输出图像路径')
    
    # 其他参数
    parser.add_argument('--conf-thres', type=float, default=0.3, help='置信度阈值')
    parser.add_argument('--iou-thres', type=float, default=0.5, help='IoU 阈值')
    
    args = parser.parse_args()
    return args

def main():
    args = parse_args()
    
    # 执行目标检测操作
    model_type = args.model
    input_image = args.image
    output_image = args.output
    confidence_threshold = args.conf_thres
    iou_threshold = args.iou_thres
    
    # 这里可以调用 Yolov5 的检测函数,并传递参数进行检测操作
    # 例如,使用 Yolov5 的函数检测输入图像并输出结果到指定路径
    
    print(f"使用 {
      
      model_type} 模型进行目标检测")
    print(f"输入图像路径: {
      
      input_image}")
    print(f"输出图像路径: {
      
      output_image}")
    print(f"置信度阈值: {
      
      confidence_threshold}")
    print(f"IoU 阈值: {
      
      iou_threshold}")
    
if __name__ == "__main__":
    main()

  上記の例では、parse_argsコマンド ライン パラメーターを解析する関数を定義し、その中でいくつかの共通の Yolov5 パラメーターを定義しました。次に、 を使用してparser.parse_args()コマンド ライン引数を解析し、結果をargs変数に保存します。

  最後に、main関数では、解析されたパラメーターを使用して Yolov5 のターゲット検出操作を実行します。このようにして、ユーザーはコマンド ラインを通じてさまざまなパラメーター値を指定して、検出動作をカスタマイズできます。

python detect.py --model yolov5s --image input.jpg --output output.jpg --conf-thres 0.3 --iou-thres 0.5

2.3.2add_argument()文法

  parser.add_argumentこのメソッドは、コマンド ライン パラメーターをコマンド ライン パーサーに追加するために使用されます。解析のために parse_args() メソッドが呼び出されるとき、次の規則に従って、位置パラメーターとオプションのパラメーター (オプション) に解析されます。

  1. 位置引数: 接頭辞のないパラメータは-位置--パラメータです。位置パラメータは通常必須であり、コマンド ライン内の位置と順序に従って解析されます。したがって、ユーザーはコマンド ライン ツールを使用するときにこれらのパラメーターを所定の順序で指定する必要があります。そうしないと、解析エラーが発生します。

  たとえば、python script.py input.txt output.txtこのコマンド行では、input.txtと はoutput.txt位置パラメータであり、ユーザーはそれらを正しい順序 (最初に入力ファイル、次に出力ファイル) で指定する必要があります。ユーザーがこれらの位置引数を指定しなかった場合、または間違った数の引数が指定された場合、コマンド ラインの解析は失敗し、適切なエラー メッセージが表示されます。

  1. オプションの引数: 通常、接頭辞--または-ガイドが付いているパラメータはオプションのパラメータであり、オプションのパラメータにはデフォルト値を設定できます。

Flags  と呼ばれる特殊なタイプのオプション パラメータもあります。これはブール型で、状態またはスイッチの存在を示すために使用されます。このパラメータがコマンド ラインで指定された場合、その値は に設定されTrue、それ以外の場合はデフォルトの に設定されますFalseフラグパラメータを定義するために使用できますaction='store_true'たとえば、次のコード行は次のようになります。

parser.add_argument('--debug', action='store_true', help='启用调试模式')

  コードでは、--debugパラメーターはフラグ パラメーターとして定義されています。action='store_true'つまり、ユーザーが--debugコマンド ラインでパラメーターを入力すると、このパラメーターは (ステータス値) に設定され、それ以外の場合は(デフォルト値)Trueになります。Falseこのパラメータの値はプログラムの他の部分に渡され、デバッグを有効にするかどうかが決定されます。

add_argument()このメソッドの完全な構文は次のとおりです。

parser.add_argument(name or flags, action, nargs, const, default, type, choices, required, help, metavar)

パラメータの詳細な説明:

  1. name or flags

    • name: 文字列。通常は位置パラメータの名前を表します。
    • flags: パラメータのフラグ。通常、オプションのパラメータとフラグの名前を指定するために使用されます。単一の文字列 (たとえば'-input'、 ) またはリスト (たとえば、['-i', '--input']) を指定できます。

  parser.add_argument('-i', '--input', type=str, help='输入文件路径')このリストの記述方法は、2 つのフラグ パラメーターを同時に定義することです。1 つは短いフラグ-i(簡潔)、もう 1 つは長いフラグ--input(読みやすさ) で、両方とも同じパラメーター (入力ファイル パス) を指します。ユーザーが自由に選択できます。

  1. action: パラメーターのアクション、つまりコマンド ライン引数を解析するときに実行する内容を定義します。一般的に使用されるアクションは次のとおりです。
    • 'store': コマンド ライン パラメータの値を変数に保存します (デフォルトのアクション)。
    • 'store_const': 定数値を変数に格納します。
    • 'store_true'、 : パラメータをマークするために使用され、'store_false'それぞれ とTrueの格納場所を示しますFalse
    • 'append': パラメーター値をリストに追加します。これを使用して、同じパラメーターを複数回指定できます。
    • 'count': パラメータの出現回数をカウントします。
  2. nargs: このパラメータが取得するコマンドラインパラメータ値の数を指定します。一般的な値は次のとおりです。
    1. None:デフォルト値。パラメータが 1 つの値のみを受け入れることを示します。
    2. Integer : 指定された数のパラメーター値が受け入れられることを示します。たとえばnargs=2、2 つのコマンド ライン パラメータを受け入れます。
    3. '?': パラメーターが 0 または 1 つの値を受け入れることができることを示します。指定しない場合は、デフォルト値が使用されます。
    4. '*': パラメーターが 0 個以上の値を受け入れることができることを示します。複数のパラメーター値がある場合、それらはリストに収集されます。
    5. '+': パラメーターには少なくとも 1 つの値が必要ですが、複数の値も受け入れることができることを示します。
  3. const:action='store_const'と組み合わせて、格納する定数値を示します。
  4. default:パラメータのデフォルト値を定義します
  5. type: パラメーターのデータ型を定義します (例int: floatstrなど)。
  6. choices: パラメータの有効な値の範囲を定義します
  7. required: ブール値。 に設定した場合True、ユーザーはコマンド ラインでこのパラメータを指定する必要があります。それ以外の場合、パラメータはオプションです。
  8. help: パラメータのヘルプ テキストを提供します。通常、パラメータの説明や使用方法が含まれます。
    10 metavar.: カスタム パラメータの表示名。通常、ヘルプ テキスト内のパラメータの名前を置き換えるために使用されます。

script.pyスクリプトを作成し、デモンストレーション用のコードを入力してみましょう。

# script.py
import argparse

# 创建 ArgumentParser 对象
parser = argparse.ArgumentParser(description='演示 argparse 参数的用法')

# 添加位置参数
parser.add_argument('position_arg', type=int, help='一个位置参数')

# 添加可选参数和标志参数
parser.add_argument('--optional_arg', type=str, help='一个可选参数')
parser.add_argument('--flag_arg', action='store_true', help='一个标志参数')

# 添加具有可选值的参数,如果未提供,将使用默认值 const(这里是 42)。
parser.add_argument('--value_arg', type=int, nargs='?', const=42, default=0, help='一个具有可选值的参数')

# 添加参数的选择范围
parser.add_argument('--choice_arg', choices=['apple', 'banana', 'cherry'], help='一个参数的选择范围')

# 添加必需参数
parser.add_argument('--required_arg', required=True, help='一个必需参数')

# 添加参数的显示名称
parser.add_argument('--display_arg', help='一个参数的显示名称', metavar='DISPLAY_NAME')

# 解析命令行参数
args = parser.parse_args()

# 输出参数的值
print('位置参数值:', args.position_arg)
print('可选参数值:', args.optional_arg)
print('标志参数值:', args.flag_arg)
print('具有可选值的参数值:', args.value_arg)
print('选择范围参数值:', args.choice_arg)
print('必需参数值:', args.required_arg)
print('显示名称参数值:', args.display_arg)

コマンド ラインでパラメーターのさまざまな組み合わせを使用してこの例をテストし、さまざまなパラメーターの使用法を理解することができます。例えば:

python script.py 10 --optional_arg optional_value --flag_arg --value_arg 5 --choice_arg apple --required_arg required_value --display_arg display_value
位置参数值: 10
可选参数值: optional_value
标志参数值: True
具有可选值的参数值: 5
选择范围参数值: apple
必需参数值: required_value
显示名称参数值: display_value

3. 数学

3.1 数学

  math モジュールは、数学的演算を実行するためのさまざまな数学関数と定数を提供します。これらの関数には、基本的な数学演算、三角関数、指数演算および対数演算、丸め関数などが含まれます。一般的な数学モジュールの関数と定数をいくつか示します。

  • 基本的な数学演算: math.sqrt()(平方根)、math.pow()(累乗演算)、math.abs()(絶対値) など。
  • 三角関数: math.sin()(サイン)、math.cos()(コサイン)、math.tan()(タンジェント)など。
  • 対数および指数演算: math.log()(自然対数)、math.exp()(指数)、math.log10()(10 を底とする対数) など。
関数名 説明する
math.ceil(x) 切り上げ:以上のx最小の整数を返します。
math.floor(x) 切り捨て:以下のx最大の整数を返します。
math.abs(x) xの絶対値を返します。
math.sqrt(x) xの平方根を返します。
math.pow(x, y) x累乗したy値を返します。
math.exp(x) 自然対数の底をべき乗しeて返しますx
math.log(x) xの自然対数を返します。
math.log10(x) xの 10 を底とする対数を返します。
math.sin(x) x(ラジアン) の正弦を返します。
math.cos(x) x(ラジアン) のコサインを返します。
math.tan(x) x(ラジアン) のタンジェントを返します。
math.pi 数学定数 π (パイ)。
math.e 自然対数の底e
math.inf 正の無限大。
math.nan 非数字。

  NumPy は、多くの数学関数と定数を含む一般的に使用されるサードパーティ ライブラリであり、豊富な数値演算関数を提供します。一般的な処理関数は次のとおりです。

関数名 説明する
numpy.array(iterable) 反復可能なオブジェクトから NumPy 配列を作成します。
numpy.arange(start, stop, step) 範囲内の値の配列を作成します。
numpy.linspace(start, stop, num) 指定された範囲内で指定された数の等間隔の値を生成します。
numpy.zeros(shape) すべてゼロの配列を作成します。
numpy.ones(shape) すべて 1 の配列を作成します。
numpy.eye(N) 単位行列 (対角線上に 1、その他の箇所に 0) を作成します。
numpy.random.rand(shape) 指定された形状の乱数 (0 から 1 の間) の配列を生成します。
numpy.sum(array) 配列内の要素の合計を計算します。
numpy.mean(array) 配列内の要素の平均を計算します。
numpy.median(array) 配列内の要素の中央値を計算します。
numpy.min(array) 配列内の最小値を見つけます。
numpy.max(array) 配列内の最大値を見つけます。
numpy.std(array) 配列内の要素の標準偏差を計算します。
numpy.var(array) 配列内の要素の分散を計算します。
numpy.dot(a, b) 2 つの配列の内積 (内積) を計算します。
numpy.cross(a, b) 2 つの配列の外積を計算します。
numpy.sin(array) 配列内の要素の正弦を計算します。
numpy.cos(array) 配列内の要素のコサインを計算します。
numpy.tan(array) 配列内の要素のタンジェントを計算します。
numpy.exp(array) 配列内の要素の指数値を計算します。
numpy.log(array) 配列内の要素の自然対数を計算します。
numpy.sqrt(array) 配列内の要素の平方根を計算します。
numpy.pi 数学定数 π (パイ)。
numpy.e 自然対数の底e

3.2 ランダム

ランダム モジュールは、乱数を生成し、乱数操作を実行するために使用されます。ランダム モジュールの一般的な機能は次のとおりです。

ランダムな関数名 説明する
random.random() 0 から 1 までのランダムな浮動小数点数を生成します。
random.randint(a, b) 指定された範囲内のランダムな整数を生成します。
random.uniform(a, b) 指定された範囲内のランダムな浮動小数点数を生成します。
random.seed(a=None, version=2) 乱数生成のシード値を設定して、繰り返し可能な乱数シーケンスを保証します。
random.randrange(start, stop, step) 指定されたステップ サイズで、指定された範囲内のランダムな整数を生成します。
random.choices(population, weights=None, k=1) 重みに基づいてシーケンスから複数の要素をランダムに選択します。

サンプルコードは次のとおりです。

import random

# 生成指定范围内的随机整数
random_integer = random.randint(1, 10)
print("随机整数:", random_integer)

# 生成指定范围内的随机浮点数
random_uniform = random.uniform(0, 1)
print("随机浮点数:", random_uniform)

# 设置随机种子以确保可重复的随机数序列
random.seed(42)
random_integer = random.randint(1, 10)
print("设置随机种子后的随机整数:", random_integer)

# 生成指定范围内的随机整数,可以指定步长
random_range = random.randrange(1, 20, 2)  # 生成1到19之间的奇数
print("随机范围内的随机整数:", random_range)

# 根据权重从序列中随机选择多个元素
options = ["apple", "banana", "cherry", "date"]
weights = [2, 1, 1, 2]  # 对应每个选项的权重
random_choices = random.choices(options, weights=weights, k=3)
print("根据权重随机选择的元素:", random_choices)

3.3 numpy は乱数を生成します

以下は、NumPy の乱数​​に関連するいくつかの一般的な関数です。

関数名 説明する
numpy.random.rand(d0, d1, ..., dn) 指定された次元の一様に分散されたランダムな浮動小数点数を生成します。
numpy.random.randn(d0, d1, ..., dn) 指定された次元の標準正規分布からランダムな浮動小数点数を生成します。
numpy.random.randint(low, high=None, size=None, dtype=int) 指定された範囲内のランダムな整数を生成します。
numpy.random.uniform(low=0.0, high=1.0, size=None) 生成指定范围内的均匀分布的随机浮点数。
numpy.random.normal(loc=0.0, scale=1.0, size=None) 生成指定均值和标准差的正态分布的随机浮点数。
numpy.random.seed(seed=None) 设置随机数生成的种子值,以确保可重复的随机数序列。
numpy.random.choice(a, size=None, replace=True, p=None) 从数组中随机选择元素。
numpy.random.shuffle(x) 随机打乱数组的顺序。
numpy.random.permutation(x) 返回一个随机排列的数组副本。

示例代码:

import numpy as np

# 生成指定维度的均匀分布的随机浮点数
rand_array = np.random.rand(2, 3)  # 2行3列的随机浮点数数组
print("随机浮点数数组:")
print(rand_array)

# 生成指定维度的标准正态分布的随机浮点数
randn_array = np.random.randn(2, 3)  # 2行3列的标准正态分布的随机浮点数数组
print("\n标准正态分布的随机浮点数数组:")
print(randn_array)

# 生成指定范围内的随机整数
randint_value = np.random.randint(1, 10, size=(2, 3))  # 2行3列的随机整数数组
print("\n随机整数数组:")
print(randint_value)

# 生成指定范围内的均匀分布的随机浮点数
uniform_value = np.random.uniform(0, 1, size=(2, 3))  # 2行3列的均匀分布的随机浮点数数组
print("\n均匀分布的随机浮点数数组:")
print(uniform_value)

# 生成指定均值和标准差的正态分布的随机浮点数
normal_value = np.random.normal(0, 1, size=(2, 3))  # 2行3列的正态分布的随机浮点数数组
print("\n正态分布的随机浮点数数组:")
print(normal_value)

# 设置随机种子以确保可重复的随机数序列
np.random.seed(42)
rand_seed = np.random.rand(2, 3)
print("\n设置随机种子后的随机浮点数数组:")
print(rand_seed)

# 从数组中随机选择元素
array_to_choose = np.array([1, 2, 3, 4, 5])
choices = np.random.choice(array_to_choose, size=3, replace=False)
print("\n从数组中随机选择的元素:")
print(choices)

# 随机打乱数组的顺序
shuffled_array = np.arange(10)
np.random.shuffle(shuffled_array)
print("\n随机打乱顺序后的数组:")
print(shuffled_array)

# 返回一个随机排列的数组副本
permutation_array = np.random.permutation(10)
print("\n随机排列的数组副本:")
print(permutation_array)

# 生成伽玛分布的随机浮点数
gamma_values = np.random.gamma(2, 2, size=(2, 3))  # 2行3列的伽玛分布的随机浮点数数组
print("\n伽玛分布的随机浮点数数组:")
print(gamma_values)

# 生成指数分布的随机浮点数
exponential_values = np.random.exponential(2, size=(2, 3))  # 2行3列的指数分布的随机浮点数数组
print("\n指数分布的随机浮点数数组:")
print(exponential_values)

四、 日期和时间

4.1 time

  Python 标准库中的 time 模块提供了与时间相关的功能和函数,用于处理时间、日期和与系统时间有关的操作。在此之前,先介绍两个基本概念:

  1. 时间戳(Timestamp):一种在计算机系统中广泛使用的时间表示方式,特别是用于时间的比较和计算。

    • 时间戳是一种表示时间的方式,通常是指从1970年1月1日午夜(UTC,协调世界时)以来的秒数,这被称为“UNIX时间戳”或“Epoch时间戳”。
    • 时间戳通常用于计算和比较时间,特别是在进行时间差计算、时间间隔计算以及执行时间戳的加减运算时非常有用。

  时间戳通常还可以包含小数部分。例如,Unix时间戳中的时间 “2023-09-12 15:30:00” 可以表示为类似于 1689330600(秒数)或 1689330600000(毫秒数)的数字;“secs” 表示其中的秒数部分(不包括毫秒)

  1. 时间元组(Time Tuple):一种人类友好的日期时间表示方法,可以轻松地访问和操作各个部分。

    • 时间元组是一个包含多个时间相关字段的数据结构,通常包括年、月、日、时、分、秒等,在time模块中用time.struct_time 类型表示。
    • 时间元组在处理日期时间的高级操作时非常有用,例如格式化和解析日期时间、进行时区转换等。

  在Python中,你可以使用 time.time() 获取当前时间的时间戳,以及使用 time.gmtime()time.localtime() 获取当前时间的时间元组。

以下是一些 time 模块的主要功能和函数:

  1. 时间戳操作

    • time.time(): 返回当前时间的时间戳,通常是自 1970 年 1 月 1 日午夜(协调世界时)以来的秒数。
    • time.mktime(t):将本地时间元组 t 转换为时间戳。其中,t 是一个包含以下九个字段的本地时间元组:
    字段名称 含义 字段名称 含义
    tm_year 年份,4 位数(例如,2023)。 tm_sec 秒,取值范围为 0 到 61(60 和 61 用于闰秒)。
    tm_mon 月份,取值范围为 1 到 12。 tm_wday 星期中的第几天,取值范围为 0(星期一)到 6(星期日)。
    tm_mday 月中的日,取值范围为 1 到 31。 tm_yday 年份中的第几天,取值范围为 1 到 366(考虑闰年)。
    tm_hour 小时,取值范围为 0 到 23。 tm_isdst 是否为夏令时(Daylight Saving Time,DST),取值为 -1(无关)、0(不是夏令时)或 1(是夏令时)。
    tm_min 分钟,取值范围为 0 到 59。
    • time.gmtime([secs]):将时间戳 secs 转换为 UTC 时间元组。
    • time.localtime([secs]):将时间戳 secs 转换为本地时间元组。
import time

# 获取当前时间的时间戳
current_timestamp = time.time()					

# 创建一个本地时间元组
local_time_tuple = (2023, 9, 12, 15, 30, 0, 1, 255, -1)

# 使用mktime将本地时间元组转换为时间戳
local_timestamp = time.mktime(local_time_tuple)
print("本地时间元组转换的时间戳:", local_timestamp)

# 使用gmtime将时间戳转换为UTC时间元组
utc_time_tuple = time.gmtime(current_timestamp)
print("UTC时间元组:", utc_time_tuple)

# 使用localtime将时间戳转换为本地时间元组
local_time_tuple2 = time.localtime(current_timestamp)
print("本地时间元组:", local_time_tuple2)
本地时间元组转换的时间戳: 1694503800.0
UTC时间元组: time.struct_time(tm_year=2023, tm_mon=9, tm_mday=12, tm_hour=8, tm_min=6, tm_sec=13, tm_wday=1, tm_yday=255, tm_isdst=0)
本地时间元组: time.struct_time(tm_year=2023, tm_mon=9, tm_mday=12, tm_hour=16, tm_min=6, tm_sec=13, tm_wday=1, tm_yday=255, tm_isdst=0)
  1. 时间元组操作

    • time.struct_time:用于表示时间的元组,包括年、月、日、时、分、秒等各个部分。时间元组的各个字段(如年、月、日等)可以通过索引或命名属性访问,以下是详细信息:
    字段名称 含义 字段名称 含义
    tm_year 年份,4 位数(例如,2023)。 tm_sec 秒,取值范围为 0 到 61(60 和 61 用于闰秒)。
    tm_mon 月份,取值范围为 1 到 12。 tm_wday 星期中的第几天,取值范围为 0(星期一)到 6(星期日)。
    tm_mday 月中的日,取值范围为 1 到 31。 tm_yday 年份中的第几天,取值范围为 1 到 366(考虑闰年)。
    tm_hour 小时,取值范围为 0 到 23。 tm_zone 时区名称(仅在某些系统中支持,通常为 None)。
    tm_min 分钟,取值范围为 0 到 59。 tm_gmtoff UTC 偏移量(仅在某些系统中支持,通常为 None)。
    • time.strftime(format[, t]):将时间元组 t(默认为当前时间)根据指定的格式字符串 format 格式化为字符串。
    • time.strptime(string[, format]):将时间字符串 string 解析为时间元组,根据指定的格式字符串 format

format表示的日期时间格式化代码含义如下:

格式化代码 含义 格式化代码 含义
%Y 年份,4 位数(例如,2023) %S 秒数,00-59
%y 年份,2 位数(00-99) %A 星期的全名(例如,Monday)
%m 月份,01-12 %a 星期的缩写(例如,Mon)
%d 月中的日,01-31 %B 月份的全名(例如,January)
%H 小时(24 小时制),00-23 %b 月份的缩写(例如,Jan)
%I 小时(12 小时制),01-12 %Z 时区的名称
%M 分钟,00-59
import time

# 创建一个自定义的时间元组
now_tuple = (2023, 9, 12, 15, 30, 0, 1, 255, -1)

# 使用time.struct_time()创建时间元组对象
now = time.struct_time(now_tuple)

# 访问时间元组的字段
year = now.tm_year

print("年份:", year)
年份: 2023
# 格式化时间
import time

# 1. 使用 time.strftime() 将时间元组格式化为字符串
current_time = time.localtime()
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", current_time)
print("当前时间的格式化字符串:", formatted_time)

# 2. 使用 time.strptime() 将时间字符串解析为时间元组
date_string = "2023-09-12 15:30:00"
format = "%Y-%m-%d %H:%M:%S"
parsed_time = time.strptime(date_string, format)
print("解析的时间元组:", parsed_time)
  1. 睡眠和定时

    • time.sleep(secs):使程序休眠 secs 秒,用于定时操作。
    • time.perf_counter():返回高精度的性能计数器值,通常用于性能测量。
  2. 其他功能

    • time.clock():返回 CPU 时间或系统时间(取决于平台)的秒数。
    • time.process_time():返回当前进程的 CPU 时间。
  3. 时区信息

    • time.timezone:本地时区与协调世界时(UTC)的秒差。通常为负数,表示东半球时区。
    • time.tzname:本地时区的名称。

4.2 datetime

参考:datetime — 基本日期和时间类型
  Python 中处理时间的标准库是 datetimedatetime 模块提供了处理日期和时间的功能,包括日期算术、日期格式化、日期解析等操作。以下是一些常用的 datetime 模块中的类和函数:

datetime常用类 描述
datetime.datetime 日期和时间的组合类,用于表示具体的日期和时间。可以创建日期时间对象、执行日期时间的算术运算、获取日期时间的各个部分(年、月、日、时、分、秒等)等。
datetime.date datetime.datetime的子类,用于表示日期的类,包括年、月、日(不包括时间)。
datetime.time datetime.datetime的子类,用于表示日期的类,包括时、分、秒、微秒(不包含日期)。
datetime.timedelta 用于表示时间间隔或持续时间的类,用于进行日期时间的加减法运算。
datetime.tzinfo 抽象基类,用于表示时区信息。
datetime.timezone 时区信息的具体实现类,Python 3.2+ 新增。

4.2.1 datetime.datetime类

以下是 datetime.datetime 类中主要方法以及参数说明:

  1. datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0): 用于创建一个新的 datetime 对象。

    • year, month, day:表示年月日,必须。
    • hour, minute, second, microsecond:时分秒毫秒,可选,默认为0
    import datetime
    
    dt = datetime.datetime(2023, 9, 12, 15, 30, 0)
    
  2. replace(year=None, month=None, day=None, hour=None, minute=None, second=None, microsecond=None)

    • 创建一个新的 datetime 对象,用指定的参数替换原对象的对应部分。
    • 每个参数都是可选的,未指定的部分将保持不变。
    import datetime
    
    now = datetime.datetime.now()
    new_date = now.replace(year=2024, month=1)
    
创建 datetime 对象的方法 描述 参数说明
datetime.now(tz=None) 获取当前日期和时间的 datetime 对象。 tz:时区信息(可选,默认为 None,表示本地时区)。
datetime.today() 返回当前日期和时间的datetime对象,不带时区信息。
datetime.utcfromtimestamp(timestamp) 从UTC时间戳创建一个datetime对象。
datetime.fromisoformat(date_string) 从ISO格式的日期字符串创建一个datetime对象。
datetime.strptime(date_string, format) 从字符串解析日期时间,并返回一个 datetime 对象。 date_string:待解析的日期时间字符串。
format:格式化字符串,用于指导日期字符串的解析。
date() 返回一个新的 datetime.date 对象,表示日期部分。
time() 返回一个新的 datetime.time 对象,表示时间部分。
datetime.combine(date, time) 将一个日期对象和一个时间对象合并为一个datetime对象。
方法 描述
strftime(format) datetime 对象格式化为指定格式的字符串。
datetime.weekday() 返回日期的星期几,星期一为0,星期日为6。
datetime.isoweekday() 返回日期的星期几,星期一为1,星期日为7。
from datetime import datetime
datetime.fromisoformat('2011-11-04')
datetime.datetime(2011, 11, 4, 0, 0)
datetime.fromisoformat('20111104')
datetime.datetime(2011, 11, 4, 0, 0)
datetime.fromisoformat('2011-11-04T00:05:23')
datetime.datetime(2011, 11, 4, 0, 5, 23)
datetime.fromisoformat('2011-11-04T00:05:23Z')
datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc)
datetime.fromisoformat('20111104T000523')
datetime.datetime(2011, 11, 4, 0, 5, 23)
datetime.fromisoformat('2011-W01-2T00:05:23.283')
datetime.datetime(2011, 1, 4, 0, 5, 23, 283000)
datetime.fromisoformat('2011-11-04 00:05:23.283')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000)
datetime.fromisoformat('2011-11-04 00:05:23.283+00:00')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc)
datetime.fromisoformat('2011-11-04T00:05:23+04:00')   
datetime.datetime(2011, 11, 4, 0, 5, 23,
    tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
import datetime

# 获取当前日期和时间
now = datetime.datetime.now()
print("当前日期和时间:", now)

# 格式化日期时间对象为字符串
formatted_date = now.strftime("%Y-%m-%d %H:%M:%S")
print("格式化后的日期时间:", formatted_date)

# 解析字符串为日期时间对象
date_string = "2023-09-12 15:30:00"
format = "%Y-%m-%d %H:%M:%S"
parsed_date = datetime.datetime.strptime(date_string, format)
print("解析后的日期时间对象:", parsed_date)

# 获取日期部分和时间部分
date_part = now.date()
time_part = now.time()
print("日期部分:", date_part)
print("时间部分:", time_part)

  在上述代码中,format = "%Y-%m-%d %H:%M:%S" 是用来指定 date_string 字符串的日期时间格式。下表列举了所有格式化代码以及它们的含义:

格式化代码 含义 格式化代码 含义
%Y 四位数的年份(例如:2023) %b%h 月份的缩写名称(例如:Sep)
%y 年份,2 位数(00-99)%c 日期时间的本地表示(例如:Tue Sep 12 15:30:00 2023)
%m 两位数的月份(01 到 12) %j 年份中的第几天(001 到 366)
%d 两位数的日期(01 到 31) %U 年份中的第几周,以星期日为一周的开始(00 到 53)
%H 2小时数(24小时制),00-23 %W 年份中的第几周,以星期一为一周的开始(00 到 53)
%I 小时数(12 小时制),01-12 %p 本地化的 AM 或 PM 。
%M 两位数的分钟(00 到 59) %w 星期的数值表示(0 表示星期日,1 表示星期一,依此类推)
%S 两位数的秒数(00 到 59) %x 日期的本地表示(例如:09/12/23)
%A 星期的完整名称(例如:Monday) %X 时间的本地表示(例如:15:30:00)
%a 星期的缩写名称(例如:Mon) %Z 时区的名称(例如:UTC)
%B 月份的完整名称(例如:September) %% 百分号字符(%)
import datetime

now = datetime.datetime.now()
# %c:日期时间的本地表示
print("本地日期时间:", now.strftime("%c")) 	 # 本地日期时间: Mon Sep 12 15:30:00 2023
# %x:日期的本地表示
print("本地日期:", now.strftime("%x"))  		 # 本地日期: 09/12/23

# %X:时间的本地表示
print("本地时间:", now.strftime("%X")) 		 # 本地时间: 15:30:00

4.2.2 datetime.timedelta类

  datetime.timedelta 类是 Python 中用于表示时间间隔或时间差的类,主要用于进行日期时间的加减法运算。以下是 datetime.timedelta 类的主要方法以及它们的参数含义:

datetime.timedelta类主要方法 描述
total_seconds() 返回时间间隔的总秒数,包括天数、秒数和微秒数。
days 返回时间间隔的天数部分。
seconds 返回时间间隔的秒数部分,不包括天数部分。
microseconds 返回时间间隔的微秒数部分。

两个不相等的 timedelta 类对象最小的间隔为 timedelta(microseconds=1)

  另外还有__add__(other)__sub__(other)魔法方法,用于时间间隔的加减法运算。这些方法的示例代码如下:
import datetime

# 创建两个时间间隔对象
delta1 = datetime.timedelta(days=2, hours=3, minutes=30)
delta2 = datetime.timedelta(days=1, seconds=7200)  				# 2小时

# total_seconds() 方法:获取总秒数
total_seconds1 = delta1.total_seconds()
total_seconds2 = delta2.total_seconds()
print("总秒数1:", total_seconds1)  								# 总秒数1: 187800.0
print("总秒数2:", total_seconds2)  								# 总秒数2: 7200.0

# days 属性:获取天数部分
days1 = delta1.days
days2 = delta2.days
print("天数1:", days1) 											 # 天数1: 2
print("天数2:", days2)  											 # 天数2: 1

# seconds 属性:获取秒数部分
seconds1 = delta1.seconds
seconds2 = delta2.seconds
print("秒数1:", seconds1)  										 # 秒数1: 12600
print("秒数2:", seconds2)  										 # 秒数2: 7200

# microseconds 属性:获取微秒数部分
microseconds1 = delta1.microseconds
microseconds2 = delta2.microseconds
print("微秒数1:", microseconds1)  								 # 微秒数1: 0
print("微秒数2:", microseconds2)  								 # 微秒数2: 0

# __add__() 方法:加法运算
result1 = delta1 + delta2
print("加法运算结果:", result1)  									 # 加法运算结果: 3 days, 5:30:00

# __sub__() 方法:减法运算
result2 = delta1 - delta2
print("减法运算结果:", result2) 									 # 减法运算结果: 0:30:00

4.2.3 datetime.timezone类

datetime.timezone类主要是表示时区信息,以下是其基本方法:

datetime.timezone类主要方法 描述
utcoffset(dt) 返回给定日期时间对象 dt 在该时区下的 UTC 偏移量(时间差)。
tzname(dt) 返回给定日期时间对象 dt 在该时区下的名称。
__eq__(other)__ne__(other) 用于比较两个时区对象是否不相等。
import datetime

# 创建一个自定义时区对象(UTC+5)
custom_timezone = datetime.timezone(datetime.timedelta(hours=5))

# 获取当前日期时间
now = datetime.datetime.now()

# 获取UTC偏移量
offset = custom_timezone.utcoffset(now)
print("UTC偏移量:", offset)

# 获取时区名称
name = custom_timezone.tzname(now)
print("时区名称:", name)

custom_timezone ==now 
UTC偏移量: 5:00:00
时区名称: UTC+05:00
False

五、 threading :多线程

  此部分内容详见《python网络爬虫指南二:多线程网络爬虫、动态内容爬取(待续)》第一章。

おすすめ

転載: blog.csdn.net/qq_56591814/article/details/132765438