Python ファイル操作

ファイル作成

f = open('text.txt', 'w')

f.write('Test\n')

# print関数でもファイルに書き込める
print('My', 'name', 'is', 'Mike', sep='#', end='!', file=f)  # My#name#is#Mike! 

f.close()

with文を使ってファイルを開く

with文を使うと、インデントの中の処理が終わるとcloseしてくれる

while open('test.txt', 'w') as f:
    f.write('Test')

ファイルを読み込む

ファイルのすべてを読み込む

with open('text.txt', 'r') as f:
    print(f.read())

ファイルの内容を1行ずつ読み込む

with open('text.txt', 'r') as f:
    while True:
        line = f.readline()
        print(line, end='')
        if not line:
             break

2文字ずつといったチャンク(かたまり)ごとに読み込む

with opne('test.txt', 'r') as f:
    while True:
        chunk = 2
        line = f.read(chunk)
        print(line)
        if not line:
            break

ファイル内の位置を移動

tellメソッドを使うと、現在ファイル内のどこ場所を指しているかがわかる

with open('test.txt', 'r') as f:
    print(f.tell())      # 0
    print(f.read(1))
    print(f.tell())      # 1

seelメソッドを使うと、ファイルの中の特定の場所に移動できる。

with open('test2.txt', 'w') as f:
    f.write('abcdefghijklmnopqrstuvwxyz')

with open('test2.txt', 'r') as f:
    f.seek(14)
    print(f.read(1))   # o
    f.seek(18)
    print(f.read(1))   # s
    f.seek(5)
    print(f.read(1))   # f

書き込みと読み込みを同時に行う

新規ファイルの読み書き

s = """\
AAA
BBB
CCC
DDD
"""
with open('test.txt', 'w+') as f:
    f.writes(s)
    f.seek(0)       # 書き込んだあとはファイルの位置が最後になっているので戻す
    print(f.read())

既存ファイルの読み書き

S = """\
EEE
FFF
GGG
"""
with open('test.txt', 'r+) as f:
    print(f.read())
    f.write(s)
 

テンプレートを使って文章作成

Tenplate関数は、標準ライブラリのstringをインポートすることによって使用可能になる。

import string

# テンプレートファイル作成
# テンプレートとなる文章をテキストファイルにして読み込み専用で扱うことによって
# 誤ってテンプレート文章を書き換えてしまうことがなぬなる。
s = """\
Hi #name.
$contents
Have a good day
"""
with open('email_template.txt', 'w') as f:
    f.write(s)

# テンプレートファイル読み込み
with open('email_template.txt', 'r') as f:
    t  = string.Template(s)

# テンプレートを元に文章を作成
contents = t.substitute(name='Mike', contents='How are you?')
print(contents)

CSVファイル操作

CSVは、csvという標準ライブラリをインポートすることによって使用可能になる。

import csv

# csv書き込み
# windowsの場合改行文字コードが\r\nになってしまうため、CSV読み込みの際に2行改行
# されてしまう。そのためnewline=''にしてファイルをオープンする
# with open('test.csv', 'w', newline='') as csv_file:  Windowsの場合
with open('test.csv', 'w') as csv_file:
    # ヘッダー部分をリストで作成
    fieldnames = ['Name', 'Count']                  # ヘッダーリスト
    writer = csv.DictWriter(csv_file, fieldnames)   # CSVを書き込む為のオブジェクト
    writer.writeheader()                            # ヘッダー書き込み

    # CSVデータ書き込み
    writer.writerrow({'Name':'A', 'Count': '1'})
    writer.writerrow({'Name':'B', 'Count': '2'})

# csv読み込み
with open('test.csv', 'r') as csv_file:
    reader = csv.DictReader(csv_file)
    for row in rader:
        print(row['Name', row['Count'])

さまざまなファイル操作

標準ライブラリのosをインポートし、さまざまなファイル操作を実行

ファイルの存在確認

import os

# ファイルの存在確認
print(os.path.exists('test.txt'))   # True

# ファイルかどうかを確かめる
print(os.path.isfile('test.txt'))   # True

# ディレクトリかどうかを確かめる
print(os.path.isdir('design'))      # True

ファイル名変更

import os

os.remane('test.txt', 'renamed.txt')

シンボリックリンクやディレクトリ、ファイルの作成

シンボリックリンクはWindowsにおけるショートカットファイルのようなもの。

import os

# シンボリックリンク作成
os.symlink('renamed.txt', 'symlink.txt')

# ディレクトリ作成
os.mkdir('test_dir')

# ディレクトリ削除
os.redir('test_dir')

pathlibというライブラリをインポートしてtouchを実行すると、中身が空のファイルを簡単に作成できる。

import os
import pathlib

# からのファイルを作成
pathlib.Path('empty.txt').touch()

# ファイルを削除
os.remove('empty.txt')

ファイルやディレクトリの列挙

listdirを使うとディレクトリの中にどのようなディレクトリがあるかを調べることができる。
globファイブらりをインポートするとディレクトリの中にあるファイルを列挙するglob関数を利用できる。

import os
import pathlib
import glob

# デレクとりの列挙
os.mkdir('test_dir')
os.mkdir('test_dir/test_dir2')
print(os.listdir('test_dir'))    # ['test_dir2']

# ファイルの列挙
pathlib.Path('test_dir/rtest_dir2/empth.txt').touch()   # 空のファイル作成
print(glob.glob('test_dir/test_dir2/*'))    # ['test_dir/test_dir2/empty.txt']

高度なファイル操作

shutilというライブラリをインポートするとファイルをコピーできるcopyが利用できる。
ディレクトリの中身ごと削除したい場合、shutilのremtreeを使用する。

import shutil
import golb

shutil.copy('test_dir/test_dir2/empty.txt', test_dir/test_dir2/empty2.txt')
print(glob.glob('test_dir/test_dir2/*'))

shult.rmtree('test_dir')

 圧縮ファイル

tarファイル

import tarfile

# tarファイル作成
with tarfile.open('test.tar.gz', 'w:gz') as tr:
    tr.add('test_dir')

# tarファイル展開
with tarfile.open('test.tar.gz', 'r:gz') as tr:
    tr.extractall('test_tar')   # 'test_tar'ディレクトリに保存される

# ファイルを展開せずに中身を確認
with tarfile.open('test.tar.gz', 'r:gz') as tr:
    # extractfileでファイルを指定
    with tr.extractfile('test_dir/sub_dir/sub_test.txt') as f:
        print(f.read())

zipファイル

import zipfile
import glob

# zipファイル作成
with zipfile.ZipFile('test.zip', 'w') as z:
    z.write('test_dir')
    z.write('test_dir/test.txt') # ディレクトリだけでなくその中身も指定する必要あり

# 対象ディレクトリやファイルを一気に指定したい場合はglobを使う
with zipfile.ZipFile('test.zip', 'w') as z:
    for f in glob.golb('test_dir/**', recursive=True):
        print(f)
        z.wirte(f)

# zipファイル展開
with zipfile.ZipFile('test.zip', 'r') as z:
    z.extractall('zzz2')

# zipファイルを展開せずに中身を確認する
with zipfile.ZipFile('test.zip', 'r') as z:
    with z.open('test_dir/test.txt') as f:
        print(f.read())

高度なファイルに関する操作

一時ファイル・ディレクトリ

一時ファイルの作成

import tempfile

# 一時ファイルを作成し、書き込んでからその内容を読み込む
with tempfile.TemporaryFile(mode='w+') as t:
    t.write('hello')
    t.seek(0)
    print(t.read())    # 'hello'

# I/Oバッファでなく実際に一時ファイルを作成したい場合
with tempfile.NamedTemporaryFile(delete=False) as t:
    print(t.name)   # 一時ファイルのパスを表示
    
    # 一時ファイルを開き、書き込んでから読み込む
    with open(t.name, 'w+) as f:
        f.write('test\n')
        f.seek(0)
        print(f.read())

一時ディレクトリの作成

import tempfile

# 一時ディレクトリ作成
with tempfile.TemporaryDirectory() as td:
    print(td)

# mkdtempで一時ディレクトリを作成
# mkdtempで作成したディレクトリはコマンドによって存在が確認できる
temp_dir = tempfile.mkdtemp()
print(temp_dir)

バックアップファイル

時間にまつわるライブラリ

import datetime

# 現在の時刻
now = datetime.datetime.now()
print(now)                                 # 2024-09-26 16:42:50.177138
print(now.isoformat())                     # 2024-09-26T16:42:50.177138
print(now.strftime('%d/%m/%y-%H%M%S%f'))   # 26/09/24-164250177138

# 年月日だけ
today = datetime.date.today()
print(today)                        # 2024-09-26
print(today.isoformat())            # 2024-09-26
print(today.strftime('%d/%m/%y'))   # 26/09/24

# 好きな時刻を作成
t = datetime.time(hour=1, minute=10, second=5, microsecond=100)
print(t)                            # 01:10:05.000100
print(t.isoformat())                # 01:10:05.000100
print(t.strftime('%H%M%S%f'))       # 011005000100

# 日付・時刻の計算
 now = datetime.datetime.now()
print(now)                          # 2024-09-26 16:51:18.507950
d = datetime.timedelta(weeks=-1)
print(now + d)                      # 2024-09-19 16:51:18.507950
d = datetime.timedelta(weeks=1)
print(now - d)                      # 2024-09-19 16:51:18.507950
d = datetime.timedelta(days=365)
print(now - d)                      # 2023-09-27 16:51:18.507950
time
import time

print('#####')
time.sleep(2)
print('#####')  # 2秒たってから表示される

# エポックタイム(1970年1月1日0時0分0秒からの経過秒)
print(time.time())     # 1727337275.865654

バックアップファイルの作成

import os        # ファイル存在チェックで使用
import shutil    # ファイルコピーで使用
import datetime  # 日時取得で使用

# 現在時刻
now = datetime.datetime.now()

# バックアップ元のファイル名
file_name = 'test.txt'

# バックアップ元ファイルが存在する場合実行される
if os.path.exists(file_name):

    # バックアップ元ファイルをファイル名に時刻を追記したファイルにコピー
    shutil.copy(file_name, "{}.{}".format(
        file_name, now.strftime('%Y_%m_%d_%H_%M_%S')))
    
# バックアップ元ファイルを作成
with open(file_name, 'w') as f:
    f.write('test')

コメント

タイトルとURLをコピーしました