個人サイト制作:サイトマップへ戻る

地味で便利なPythonによるファイル操作

Python、とても流行していますね!
弊サイトにもいろんなキーワードで来訪者があります。
書店に行くと機械学習関連のPython書籍が多く見られますが、ここではちょっとしたファイル操作に関するPythonスクリプトを掲載します。
中にはコマンドプロンプトで実行できるものもあるんだけど、ある種のCLIツールみたいに手元にスクリプトを置いておくと、後から簡単に実行できて便利だからね。

このページに関する注意事項

当Webサイト作成者は、例示を目的としてマークアップ及びプログラミング例を提供しており、明示または黙示にかかわらず、いかなる責任も負わないものとします。
このページは、説明されているマークアップ及びプログラミング言語、手順を作成およびデバッグするために使用される各種ツールに読者が精通していることを前提にしています。
このページは、特定の機能を説明するのに役立つ可能性がありますが、当Webサイト作成者がこれらの例を変更した上で、特定の要件を満たすために追加の機能を提供したり、システムを構築したりすることはできません。
加えて、この例の手順に従う場合は、読者の各種ファイルを事前にバックアップすることを推奨いたします。

ファイル名をまとめて変更

Windowsでまとめてリネームすると、なぜかファイル名に半角スペースが挿入されるんですよね。
初めから意図して変更しても良いんだけど、自動的に数字を振ってくれるのは助かる。
そこで、GUIベースでファイルリネームしてから半角スペースをPythonで削除しちゃってます。

ファイルから半角スペースを削除するfile_space.py


import os

directory = r'C:\Users\アレコレ\Desktop\flower3'

for filename in os.listdir(directory):
    old_filepath = os.path.join(directory, filename)
    new_filename = filename.replace(' ', '')  # 半角スペースを削除
    new_filepath = os.path.join(directory, new_filename)
    os.rename(old_filepath, new_filepath)

print("ファイル名のリネームが完了しました。")
    

まぁ、ちょっとした手元の小ネタですよ。
スクリプトの説明は次のとおり。

モジュールのインポート
osモジュールをインポートして、ディレクトリ操作やファイル名の変更を行います。
ディレクトリの指定
directory変数に、対象となるディレクトリのパスを指定します。
ディレクトリ内のファイルをリストアップ
os.listdir(directory)を使用して、指定したディレクトリ内のすべてのファイル名を取得します。
各ファイル名のリネーム
取得したファイル名を一つずつ処理します。
old_filepathに元のファイルのパスを、new_filenameにファイル名から半角スペースを削除した新しいファイル名を設定します。
new_filepathに新しいファイル名のフルパスを設定し、os.rename(old_filepath, new_filepath)でファイル名を変更します。
完了メッセージの表示
すべてのファイル名のリネームが完了した後、完了メッセージを表示します。

ファイル数をまとめて数える

これは私の個人都合に限りなく近いですね。
CSSやJavaScriptはほとんど機会ないけど、htmlに関してはまとめて一括操作したいことがあるんです。
グローバルナビゲーションを変更したりとか。
そういう時にいちいち手作業でやってたら、日が暮れるどころか年越ししちゃいますよ。
現在自分のサイトにいくつのhtmlページがあるのか、正確な数を把握するのに使ってます。

HTML・CSS・JavaScriptのファイルを数えるfile_sum.py


import os

def count_files(directory, extension):
    count = 0
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(extension):
                count += 1
    return count

# メインディレクトリを指定
main_directory = r'C:\Users\アレコレ\OneDrive\_fein\google cloud\fein-sites-dev1\www'

# 各ファイルタイプの総数を計算
total_html_files = count_files(main_directory, '.html')
total_css_files = count_files(main_directory, '.css')
total_js_files = count_files(main_directory, '.js')

# HTMLファイルは2を引く
html_result = total_html_files - 2

# 結果を表示
print(f"{html_result} の HTMLファイルがあります")
print(f"{total_css_files} の CSSファイルがあります")
print(f"{total_js_files} の JavaScriptファイルがあります")
    

htmlファイル数から2を引いているのは、私個人の環境によるものです。
このサイトには直接的にWebページとしては表示されないものの、htmlページの構成要素の一部として使われる commongdl.html と menu.html という2つのファイルが存在します。
この2つは例外として扱わないと、ファイル数を確認してからまとめてスクリプトを実行する時に支障が出る可能性があるんですよね。
他の様々なhtmlファイルは一貫して似たような構造を持たせているのです。
そうすることによって、柔軟な運用が効くようになる。
VS Codeやスクリプトを使ってhtmlファイルをミスなく一括操作しやすいってわけです。
では、スクリプトの説明に移りましょう。

モジュールのインポート
osモジュールをインポートして、ディレクトリの操作を行います。
count_files関数の定義
指定されたディレクトリ内のファイル数を数えます。
directoryはディレクトリのパス、extensionはファイルの拡張子です。
ディレクトリを再帰的に探索し、指定された拡張子で終わるファイルの数をカウントして返します。
メインディレクトリの指定
main_directory変数に、対象となるメインディレクトリのパスを指定します。
ファイルタイプの総数を計算
count_files関数を使用して、.html.css.jsファイルの総数を計算します。
HTMLファイル数の調整
HTMLファイルの総数から2を引きます。
これが私固有の要件に応じた調整となります。
結果の表示
計算された各ファイルタイプの総数をプリントします。

多数のhtmlファイルにまとめて加筆する

Web制作あるあるだと思うのですが、後から多数のhtmlファイルに特定のコードを挿入したいことがあります。
そんなときにもPythonは便利に使えます。
VS Codeのデフォルト機能でやることもできるけど、ちょっとでも指定を間違えると大惨事になってしまったりする。
このPythonでやる方法もバックアップが必要であることは変わりませんが、狙ったポイントにコードを入れやすいと感じます。

多数のhtmlファイルにまとめてコードを挿入するpwa.py


import os

directory = 'C:/Users/ユーザー名/Desktop/pwahtml'

manifest_link = '<link rel="manifest" href="/manifest.json">\n'
service_worker_script = '''
<script>
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/service-worker.js')
      .then(registration => {
        console.log('ServiceWorker registration successful with scope: ', registration.scope);
      })
      .catch(error => {
        console.log('ServiceWorker registration failed: ', error);
      });
  }
</script>
'''

for filename in os.listdir(directory):
    if filename.endswith(".html"):
        file_path = os.path.join(directory, filename)
        with open(file_path, 'r', encoding='utf-8') as file:
            content = file.read()

        if '<head>' in content:
            new_content = content.replace('<head>', '<head>\n' + manifest_link + service_worker_script)
        else:
            continue

        with open(file_path, 'w', encoding='utf-8') as file:
            file.write(new_content)

print("すべてのHTMLファイルにPWAコードを挿入しました。")

このPythonコードは特定のフォルダ内にあるすべてのHTMLファイルに、Progressive Web App (PWA) 関連のコードを自動的に挿入するものです。

1. モジュールのインポート


import os

os モジュールはオペレーティングシステムとの対話を行うために使用されます。
このコードでは、ディレクトリの内容を一覧表示したり、ファイルパスを操作するために使用しています。

2. ディレクトリの設定


directory = 'C:/Users/ユーザー名/Desktop/pwahtml'

この変数には、操作対象となるHTMLファイルが保存されているディレクトリのパスを指定します。

3. 挿入するPWAコードの定義


manifest_link = '<link rel="manifest" href="/manifest.json">\n'
service_worker_script = '''
<script>
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/service-worker.js')
      .then(registration => {
        console.log('ServiceWorker registration successful with scope: ', registration.scope);
      })
      .catch(error => {
        console.log('ServiceWorker registration failed: ', error);
      });
  }
</script>
'''

manifest_link
マニフェストファイルへのリンクが含まれています。

service_worker_script
サービスワーカーを登録するためのJavaScriptコードが含まれています。

4. ディレクトリ内のファイルのループ処理

for filename in os.listdir(directory):

os.listdir(directory)
指定したディレクトリ内のすべてのファイルとフォルダを一覧表示します。

for filename in os.listdir(directory):
ディレクトリ内の各ファイルに対してループを行います。

5. HTMLファイルの処理


if filename.endswith(".html"):
    file_path = os.path.join(directory, filename)
    with open(file_path, 'r', encoding='utf-8') as file:
        content = file.read()

    if '<head>' in content:
        new_content = content.replace('<head>', '<head>\n' + manifest_link + service_worker_script)
    else:
        continue

    with open(file_path, 'w', encoding='utf-8') as file:
        file.write(new_content)

if filename.endswith(".html"):
ファイルがHTMLファイルかどうかを確認します。

file_path = os.path.join(directory, filename)
ファイルのフルパスを取得します。

with open(file_path, 'r', encoding='utf-8') as file:
HTMLファイルを読み込むためにファイルを開きます。

content = file.read()
ファイルの内容を文字列として読み込みます。

if '<head>' in content:
ファイルに <head> タグが含まれているかを確認します。

new_content = content.replace('<head>', '<head>\n' + manifest_link + service_worker_script)
<head> タグの直後にPWAコードを挿入します。

with open(file_path, 'w', encoding='utf-8') as file:
変更された内容をファイルに書き込むためにファイルを開きます。

file.write(new_content)
変更された内容を書き込みます。

6. 完了メッセージの表示


print("すべてのHTMLファイルにPWAコードを挿入しました。")

最後に、処理が完了したことを示すメッセージを表示します。

他にも狙った部分のコードをまとめて変更したりとか、いろいろできます。
後からまとめてデザイン部分を変更したくなるとか、よくあるからね。
そこらへんは追って書いていこうかと思います。


サイトマップ

全ページをリスト化したサイトマップも用意していますが、けっこうなページ数があります。
下記の「カテゴリー分けサイトマップ」のほうが使いやすいでしょう。

アナザーエデン関連ページ・サイトマップ

アナザーエデンの強敵戦やストーリーコンテンツのリスト、お勧めバッジなどを掲載したコーナーです。
期間限定のない普通のRPGですので、初心者でも安心して続けていけるゲームとなっています。
もっとも重要なグラスタについては、場所別に網羅した表があります。

個人サイトのホスティングとコンテンツ作成

個人でウェブサイトを作るにはどうすればいいか。
HTML・CSS・JavaScriptの書き方はもちろん、無料かつ広告なしでホームページを作る方法を掲載したコーナーです。
Webデザインやレイアウトについても書いてあります。

魚釣りなどアウトドアのエリア

ゲームとパソコンだけじゃなく、アウトドアも趣味なんです。
このコーナーでは魚釣りの記録とか、魚料理のレシピ、はたまたサイクリングなどなど。
アウトドアに関連するコンテンツが詰め込まれています。