はじめに
業務効率に際して、抽象度を高めると業務・タスクの多くは各種ファイルを自動処理するようなものがほとんどだと思います。
そこで本記事では、Pythonにおける各種ファイル操作を実行する際に便利な情報を共有していきたいと思います。
テキストファイルの入出力
with open("ファイル名", "w", encoding="文字エンコーディング") as 変数:
# 文(具体的な処理)…
with文
内側の文を実行し終えると開いたファイルを自動的に閉じてくれます。
with文を使わずに後述するopen関数を実行すると、開いたファイルオブジェクトのcloseメソッドを使って手動で閉じなければなりません。
人間なので「ファイルの閉じ忘れ」は絶対するでしょうし、本質的でない実装部は Python 側に任せたほうが賢明です。
- 具体例
# message.txt を新規作成、もしくは既存ファイルの内容を全て削除して上書き保存する
# 注意: anothers フォルダ(ディレクトリ)が存在しない場合はエラーとなる
with open("../anothers/message.txt", "w", encoding="utf-8") as message_txt_file:
message_txt_file.write("Hello\n") # 書き込み: Hello 改行
message_txt_file.write("Python\n") # 書き込み: Python 改行
message_txt_file.write("World\n") # 書き込み: World 改行
open関数
ファイルを開く Python の組み込み関数で、ファイルオブジェクト(ファイルを表すオブジェクト)を返します。
上記例の場合as後の変数(message_txt_file)に当該ファイルオブジェクトが格納されています。
第一引数:
操作対象となるファイル名(上記例:"../anothers/message.txt")
- ディレクトリ名を含むパス指定も可能
第二引数:
ファイルに対する具体的な操作指示(上記例:w)。記述省略するとr判定となる。
-
r:読み込み(デフォルト) -
w:書き込み- ※指定したファイルが存在しない場合は新規作成され、既にある場合は上書き保存される
-
a:追加書き込み
encodingキーワード引数:
ファイル読み書きの際の文字エンコーディング(例:utf-8, shift-jis, ...)
ファイルオブジェクトのメソッド
※ファイルオブジェクトとは、先ほど紹介したようにopen関数の戻り値になります。
write
ファイルにテキストを書き込める。末尾で改行しないので改行したい場合は\nを記述する。
read
ファイルのテキストを文字列にする。
# `open`関数の第二引数を省略して`r`(読み込み)操作を実施
with open("../anothers/message.txt", encoding="utf-8") as message_txt_file:
# 改行を半角スペースに置換(Hello Python World)
print(message_txt_file.read().replace("\n", " "))
csvモジュール
CSVファイルの入出力を実現する標準ライブラリ。
import csv
# `newline`には空文字列(`""`)を指定
with open("ファイル名", "w", encoding="文字エンコーディング", newline="") as 変数:
csv.writer(変数).writerows(イテラブル)
csvモジュールを使う場合、引数newlineを指定しないと改行が余分に出力されて各行の間に空行が入ってしまうのでnewlineに空文字列("")を指定してください。
- 具体例
import csv
# items.csv を新規作成、もしくは既存ファイルの内容を全て削除して上書き保存する
# 注意: anothers フォルダが存在しない場合はエラーとなる
for_csv_txt_lists = [("hat", 2000), ("shirt", 1000), ("socks", 500)]
with open("../anothers/items.csv", "w", encoding="utf-8", newline="") as csv_file:
csv_file_obj = csv.writer(csv_file)
csv_file_obj.writerows(for_csv_txt_lists)
csv.writer(ファイルオブジェクト)
CSVファイルを操作するためのオブジェクトを作成します。このwriterオブジェクトを通じて以下メソッドを用いたCSVファイルの編集作業を行っていきます。
writerows(イテラブル)
writerオブジェクトを通じて、CSVファイルに「複数行」をまとめて書き込むメソッド。
引数に指定するイテラブルの要素をCSVファイルの各行として出力する。
- イテラブル
イテラブルは繰り返し処理可能なデータ構造で、Python では「リスト・タプル・集合・辞書」といったものに分類されます。フロントエンド側の表現にすると配列です。
writerow(イテラブル)
writerオブジェクトを通じて、CSVファイルに「1行」を書き込むメソッド。
引数に指定するイテラブルの各要素を、1行の各列(カラム)として出力する。
-
writerow([1, 2, 3])→ CSV に 1,2,3 という1行を出力 - イテラブルの各要素が列(カラム)になる
csv.reader(ファイルオブジェクト)
readerオブジェクトはイテラブルとして働き、対象CSVファイルの各行に含まれる値をリストとして返す。
with open("../anothers/items.csv", encoding="utf-8") as csv_file:
csv_reader_obj = csv.reader(csv_file)
for item in csv_reader_obj:
print(item)
# ['hat', '2000']
# ['shirt', '1000']
# ['socks', '500']
jsonモジュール
jsonファイルの入出力を実現する標準ライブラリ。
import json
with open("ファイル名", "w", encoding="文字エンコーディング") as 変数:
json.dump(イテラブル, 変数, indent=整数)
- 具体例
# items.json を新規作成、もしくは既存ファイルの内容を全て削除して上書き保存する
# 注意: anothers フォルダが存在しない場合はエラーとなる
for_json_dict = [
{"name": "hat", "price": 2000},
{"name": "shirt", "price": 100},
{"name": "socks", "price": 500},
]
with open("../anothers/items.json", "w", encoding="utf-8") as json_file:
json.dump(for_json_dict, json_file, indent=2)
# [
# {
# "name": "hat",
# "price": 2000
# },
# {
# "name": "shirt",
# "price": 100
# },
# {
# "name": "socks",
# "price": 500
# }
# ]
dump関数(書き込み系処理)
-
json.dump(イテラブル, ファイルオブジェクト, インデント数の指定)
対象ファイルにイテラブルの内容を書き込む関数。
indentキーワード引数
indentに整数を指定すると jsonファイルに改行やインデントを挿入できます。
load関数(読み込み系処理)
-
json.load(ファイルオブジェクト)
対象 jsonファイルを読み込む関数。
with open("../anothers/items.json", encoding="utf-8") as json_file:
print(json.load(json_file))
# [{'name': 'hat', 'price': 2000}, {'name': 'shirt', 'price': 100}, {'name': 'socks', 'price': 500}]
ここまでは主に、テキストファイルやその編集操作にスポットを当ててきました。
以降は、テキストファイルのほか画像データなど幅広いファイルやデータに関する操作を説明してきます。
ファイルやデータに関する操作いろいろ
ファイルの一覧取得
glob(グラブ)モジュール
指定したディレクトリにあるファイルの一覧を取得できる標準ライブラリ。
返り値はファイル一覧のリスト形式(イテラブル)となる。
例えば、特定の拡張子を持つファイルだけを列挙したり、サブディレクトリを含めてファイルを列挙したりできる。
- ファイルの一覧取得コード例
import glob
# 指定したパス(※ファイルやディレクトリの場所を指す文字列)にあるファイルの一覧を取得
# 返り値はファイル一覧のリスト形式(イテラブル)
glob.glob(パス)
# サブディレクトリも含める場合は以下の記述となる
# キーワード引数`recursive`を`True`にすることで
# サブディレクトリも処理対象(=指定したディレクトリ全体が処理対象)となる
glob.glob(パス, recursive=True)
# * でワイルカード指定となる
# 以下記述だと`.txt`拡張子のファイルだけを列挙する
glob.glob("*.txt")
# glob.glob("../anothers/*.txt")
ファイルのコピーや名称変更、削除
shutil
ファイルの内容やパーミッション(※操作許可権限)、最終アクセス時刻、最終更新時刻など含めてコピーできる標準ライブラリ。
shutil.copy(コピー元, コピー先)
- ファイルのコピー(コピー先のディレクトリが存在しない場合はエラーが発生)
- ファイルの内容とパーミッションのみをコピー
import shutil
shutil.copy(コピー元, コピー先)
shutil.copy2(コピー元, コピー先)
- より完全なファイルコピー(コピー先のディレクトリが存在しない場合はエラーが発生)
- ファイルの内容とパーミッションに加えて、最終アクセス時刻や最終更新時刻といったメタデータも保持
- より完全なバックアップが可能なため
copy2()を使用するのが一般的
import shutil
shutil.copy2(コピー元, コピー先)
shutil.move(移動元, 移動先)
- ファイルの移動
import shutil
shutil.move(移動元, 移動先)
os
ファイルのリネームや削除、パーミッション変更、ディレクトリ(フォルダ)作成・削除など包括的なファイル操作を備えた標準ライブラリ。
※osよりもpathlibを使うことも多いです。
import os
# ファイル名の変更
os.rename(古い名前, 新しい名前)
# ファイルの削除
os.remove(パス)
# モードの設定
# ファイルやディレクトリのアクセス権限(パーミッション)を変更するための関数
os.chmod(パス, モード)
# ディレクトリの作成
os.mkdir(パス)
# ディレクトリの削除
os.rmdir(パス)
# 再帰的にディレクトリを作成
os.makedirs(パス)
# 再帰的にディレクトリを削除
os.removedirs(パス)
再帰的にディレクトリを作成するmakedirs関数
そもそも「再帰的」とは「あるもの(概念、処理、構造など)が、それ自身の一部を含んでいたり、それ自身を呼び出したりして定義・構成される性質や方法」を指します。
つまり、合せ鏡のように「写っている自分も含めて〜される」というニュアンスです。
makedirs関数は、ディレクトリ作成時に「途中の必要なディレクトリ」も一緒に作成してくれます。
例えば、project/programming/pythonというパスを引数に指定するとproject,programming,pythonといった各パスごとのディレクトリを作成するのです。
再帰的にディレクトリを削除するremovedirsも同様の振る舞いで各ディレクトリを削除します。
ファイルやディレクトリのアクセス権限(パーミッション)を変更するための関数 os.chmodの実装例
パーミッション644の場合(一般的なファイル権限)を想定します。
- 所有者: 読み / 書き 可 (6 = 4 + 2)
- グループ: 読み取りのみ (4)
- その他: 読み取りのみ (4)
import os
os.chmod('example.txt', 0o644)
次は、以下755の場合(実行可能なファイルやディレクトリ)です。
- 所有者: 読み / 書き / 実行 可 (7 = 4 + 2 + 1)
- グループ: 読み / 実行 可 (5 = 4 + 1)
- その他: 読み / 実行 可 (5 = 4 + 1)
import os
os.chmod('example.sh', 0o755)
Python での数値関連データの取り扱い
ファイルやデータの内容によっては数値を扱う場面が出てくるかもしれません。
Python における数値関連の関数やメソッド、計算式についても触れておきます。
round関数
数値の小数部分を指定した桁数に丸めて返す。
(第二引数の)桁数を省略した場合は数値に最も近い整数を返す。引数には整数(int)と浮動小数点(float)を指定できる。
print(round(1 / 3)) # 0(※数値に最も近い整数)
print(round(1 / 3, 2)) # 0.33(※小数部を2桁に丸めている)
数値に最も近い整数が奇数と偶数の2種類発生した場合は最も近い偶数へ丸められる。
print(round(3 / 2)) # 2
print(round(3 / 2, 2)) # 1.5
第二引数に負の値を指定した場合は、その桁数に準じて整数を丸めることができる
print(round(123, -1)) # 120 (下1桁を丸める)
print(round(123, -2)) # 100 (下2桁を丸める)
print(round(123, -3)) # 0 (下3桁を丸める)
バイナリデータ(0,1で成るテキストではないデータ)を取得
bytes関数
「イミュータブル(変更・更新不可)なバイト列」を返す
bytes(文字列, encoding=文字エンコーディング)
bytes('python', encoding='utf-8')
bytes(整数)
整数が示すバイト数のバイト列やバイト配列を生成する
bytes(イテラブル)
イテラブルの要素(※0以上255未満の整数である必要がある)を格納したバイト列やバイト配列を生成する
bytearray関数
「ミュータブル(変更・更新可能)なバイト配列」を返す
bytearray(文字列, encoding=文字エンコーディング)
bytearray('python', encoding='utf-8')
bytearray(整数)
整数が示すバイト数のバイト列やバイト配列を生成する
bytearray(イテラブル)
イテラブルの要素(※0以上255未満の整数である必要がある)を格納したバイト列やバイト配列を生成する
「バイト列」または「バイト配列」はどちらも 0以上255未満の整数 (1バイト:8ビットの符号なし整数を並べたもの)
memoryview(オブジェクト)関数
指定したオブジェクト内部にあるメモリを操作するための関数。コピーは作らず、元メモリを操作する。
bin
整数を2進数の文字列に変換する。binはbinary:バイナリ、2進数の略。
print(bin(123)) # 0b1111011
print(f"{123:b}") # 1111011
print(f"{123:#b}") # 0b1111011 ← 0b が付く
oct
整数を8進数の文字列に変換する。octはoctal:オクタル、8進数の略。
print(oct(123)) # 0o173
print(f"{123:o}") # 173
print(f"{123:#o}") # 0o173 ← 0o が付く
hex
整数を16進数の文字列に変換する。hexはhexadecimal:ヘクサデシマル、16進数の略。
print(hex(123)) # 0x7b
print(f"{123:x}") # 7b
print(f"{123:#x}") # 0x7b ← 0x が付く
計算式について
Pythonの計算式は、 原則「左結合(左側にある式を優先的に計算)」なのですが、**(べき乗)のみ「右結合」で処理(計算)されるので注意 してください。
※ややこしいので、明示的に()を使って計算式を書く方が無難だと思います。
除算(割り算)について
/を用いて除算(割り算)を行うと浮動小数点(型)として、//を用いて除算を行うと整数(型)として扱われる。
print(4 / 2) # 2.0
print(4 // 2) # 2
divmod()
除算(割り算)の商と剰余(余り)を求め、タプルにまとめて返す関数。引数の数値には整数と浮動小数点が指定できる。
# 数値Aを数値Bで除算した時の「商と剰余のタプル」を返す
divmod(数値A, 数値B)
# 具体例
print(divmod(30, 5)) # (6, 0)
print(divmod(53, 3)) # (17, 2)
abs(エービーエス)
数値の絶対数を返す関数(absはabsolute numberの略称)。
# 引数の数値には「整数、浮動小数点、複素数」が指定できる
abs(数値)
# 具体例
print(abs(123)) # 123
print(abs(-456)) # 456
print(abs(12.3)) # 12.3
print(abs(-12.3)) # 12.3
pow(パウ)
べき乗計算(**)を行う関数。引数の数値には「整数、浮動小数点、複素数」が指定できる。
# 数値Aを数値B乗した数
pow(数値A, 数値B)
# 数値Aを数値B乗した数を数値Cで割った余り
pow(数値A, 数値B, 数値C)
# 具体例
print(pow(2, 3)) # 2の3乗 -> 8
print(pow(2, 3, 5)) # 2の3乗を5で割った余り -> 3
min, max
複数の引数(文字列型含む)またはイテラブルから最小(min)、最大(max)の要素・値を取得する。
文字列型の場合は文字コード順
print(min("blue", "red", "green")) # blue
print(max("blue", "red", "green")) # red
イテラブル(例:数値型リスト list(int))
some_numbers = [100, 10, 25, 8, 64]
print(min(some_numbers)) # 8
print(max(some_numbers)) # 100
sum
イテラブルに含まれる数値の合計値を算出する関数。
want_sum_numbers = [90, 75, 80, 100, 85]
print(sum(want_sum_numbers)) # 430
print(sum(want_sum_numbers) / 5) # 平均値:86.0
print(sum(want_sum_numbers) // 5) # 平均値:86(//を使うことで整数として表現)
-
sum関数は、JavaScript でいうreduce関数に近い
const want_sum_numbers = [90, 75, 80, 100, 85];
const sum_result = want_sum_numbers.reduce((accu, curr) => accu + curr, 0);
console.log(sum_result); // 430
さいごに
ここで述べてきた内容は自分で一から書いていくよりはAI(LLM)が出してきたコードを調整する際に活用するようなものだと思います。
実際、筆者がAI(LLM)へタスク依頼した際には with文を付けずにコード生成・提出してきたことがある ので、こういった知識や情報を知っていると、より堅牢なコード修正指示ができるようになると思います。
この記事がAIを活用するエンジニア・非エンジニアに少しでも役立つと幸いです。
ここまで読んでいただき、ありがとうございました。