複数ファイル内の文字列置換#
1#
以下に、指定されたディレクトリ内のすべてのテキストファイルのパスを取得し、特定の文字列が含まれている場合に置換するPythonスクリプトの例を示します。このスクリプトは、osモジュールとfileinputモジュールを使用しています。
まず、osモジュールを使用してディレクトリ内のファイルを見つけ、fileinputモジュールを使用してテキストファイル内の特定の文字列を置換します。
import os
import fileinput
def replace_string_in_files(directory, target_string, replacement_string):
for root, _, files in os.walk(directory):
for file in files:
if file.endswith(".txt"): # テキストファイルを処理
file_path = os.path.join(root, file)
with fileinput.FileInput(file_path, inplace=True, backup=".bak") as f:
for line in f:
new_line = line.replace(target_string, replacement_string)
print(new_line, end="") # 標準出力に新しい行を出力
if __name__ == "__main__":
target_directory = "/path/to/your/directory" # 対象のディレクトリのパス
target_string = "置換したい文字列"
replacement_string = "新しい文字列"
replace_string_in_files(target_directory, target_string, replacement_string)
このスクリプトでは、指定したディレクトリ内のすべてのテキストファイルを再帰的に処理し、特定の文字列を新しい文字列で置換します。また、元のファイルは.bakの拡張子でバックアップされます。必要に応じて、変数を適切に調整してください。
2#
import os
def replace_string_in_files(directory, target_string, replacement_string):
for root, _, files in os.walk(directory):
for file in files:
if file.endswith(".txt"):
file_path = os.path.join(root, file)
with open(file_path, "r", encoding="utf-8") as f:
lines = f.readlines()
with open(file_path, "w", encoding="utf-8") as f:
for line in lines:
new_line = line.replace(target_string, replacement_string)
f.write(new_line)
if __name__ == "__main__":
target_directory = "/path/to/your/directory"
target_string = "置換したい文字列"
replacement_string = "新しい文字列"
replace_string_in_files(target_directory, target_string, replacement_string)
このスクリプトは、指定したディレクトリ内のテキストファイルを読み取り、特定の文字列を新しい文字列で置換して元のファイルに上書きします。バックアップは作成されません。必要に応じて、変数を適切に設定して使用してください。
yaml ファイルの場合#
再帰関数を使用して、文字列を置換
import os
import yaml
def replace_string_in_yaml_files(directory, target_string, replacement_string):
for root, _, files in os.walk(directory):
for file in files:
if file.endswith(".yaml"):
file_path = os.path.join(root, file)
with open(file_path, "r", encoding="utf-8") as f:
yaml_data = yaml.safe_load(f)
if yaml_data:
updated_yaml_data = replace_string_recursive(yaml_data, target_string, replacement_string)
with open(file_path, "w", encoding="utf-8") as f:
yaml.dump(updated_yaml_data, f, default_flow_style=False, allow_unicode=True)
def replace_string_recursive(data, target_string, replacement_string):
if isinstance(data, str):
return data.replace(target_string, replacement_string)
elif isinstance(data, list):
return [replace_string_recursive(item, target_string, replacement_string) for item in data]
elif isinstance(data, tuple): # 追加: タプルに対する処理
return tuple(replace_string_recursive(item, target_string, replacement_string) for item in data)
elif isinstance(data, dict):
return {key: replace_string_recursive(value, target_string, replacement_string) for key, value in data.items()}
else:
return data
if __name__ == "__main__":
target_directory = "/path/to/your/directory"
target_string = "置換したい文字列"
replacement_string = "新しい文字列"
replace_string_in_yaml_files(target_directory, target_string, replacement_string)