Python - テキストの文字列を置き換える

クラウディア 
1. 概要
2. テキストの文字列を置き換える

1. 概要

 大変なことになったのです。  本サイトで、「<table>」タグ内で、表題の行の「<th>」の中は、見栄えのいいように「css」で均等割り付けで表示しているのですが。  カラムの幅が広いときに、表題の文字数が少ないと、間延びして見栄えが悪いので、前後に全角スペースを同数入れて調整しています。  最近まで、なんの問題もなかったのですが、最近(2024年6月22日)全角スペースを文字と認識してくれなくなったのです。  均等割り付けで表示しているつもりのものが、均等割り付け風、右寄せで表示されるようになりました。
  こ  ん  な  つ  も  り  が  
     こ  ん  な  見  栄  え  に
 単にわたしが使用していたブラウザの仕様が変わったのか、そのあたりがようわからなくて、他のブラウザでは、前からそうだったのかもしれませんが。  全角スペースを「&emsp;」へ置き換えれば、以前と同じように表示してくれます。  しかし、膨大な量のコンテンツがあるので、これをすべて、手入力で置き換えていくのは、気の遠くなるような作業になります。  でまぁ、プログラムで変換できないかなと思った次第です。  わはは、今回は、前置きが長いなぁ。

2. テキストの文字列を置き換える

 ということで、下記のソースを書きました。

import os
from bs4 import BeautifulSoup

dirname = 'ここにドキュメントルートを定義しています'

def convert(fullpath):

  # ディレクトリ名は 表示だけで終了
  if os.path.isdir(file):
    print(file)
    return

  # .php 以外は何もせずに終了
  if os.path.splitext(file)[1] != '.php':
    return

  # ファイルを開いて 全体・行単位で 読み込み
  fs = open(file, 'r', encoding='UTF-8')
  data = fs.read()
  fs.seek(0, os.SEEK_SET)
  lines = fs.readlines()
  fs.close()

  soup = BeautifulSoup(data, 'html.parser')

  # th のタグがなければ 対象外
  if soup.find('th') is None:
    return

  # 書き直し発生なして出初期化
  rewrite = False
  newlines = []

  for line in lines:
    if 'th' not in line:
      newlines.append(line)
      continue

    rewrite = True
    newlines.append(line.replace(' ', '&emsp;'))

  # 書き直しが発生していなければ 終了
  if not rewrite:
    return

  # ファイル更新
  with open(file, 'w') as fs:
    fs.writelines(newlines)

  print('  '+file)

# ディレクトリ以下を再帰検索
def find_all_files(directory):
  for root, dirs, files in os.walk(directory):
    yield root
    for file in files:
      yield os.path.join(root, file)

# ここから実行開始
for file in find_all_files(dirname):
  convert(file)
 解説しますと。  「laravel」のソースが対象なので、4行目の「dirname」には、「laravel」の「resources/views」のディレクトリを指定しています。  52~57行は、指定したディレクトリを再帰検索しながらファイル名をリストしていきます。  リストされたファイル名を、次々に「def convert」6~50行へ放り込んでいくわけです。  「def convert」の中身は。  8~11行で、ディレクトリの場合は、表示だけして、終了します。  13~15行で、拡張子「.php」以外は、何もせずに終了します。  17~22行で、「.php」ファイルの中身を、一気に読み込み、行単位で読み込みで、ファイル全体を読み込みます。  24~28行で、「.php」ファイルは、ほぼ「.html」ファイルのように記述していますので、ウェブスクレイピングにかけて。  「<th>」のタグがなければ、処理対象ではないので、何もせずに終了します。  30~44行で、「.php」ファイルの中身を、行ごとにチェックしていきます。  「<th>」タグのある行内の、全角スペースの文字を「&emsp;」へ置き換えていきます。  ここ無駄でありましたが、「<th>」が検出できなければ、そのまま終了ですが、そうでなくて、全角スペースの置き換えの有無を見るべきであった。  46~50行で、「.php」ファイルを全角スペースの文字を「&emsp;」へ置き換えたもので更新し、ファイル名を出力して、このファイルの処理を終了します。  以上、これを実際に実行して、たぶん、うまくいってるんじゃないかな・・・。
ハイスピードプラン