chatgptに作ってもらった、特定フォルダ内のテキストファイルのn行目までを取得してファイル名にしてくれるpythonスクリプト
とても便利
自分の環境でテキストみるみるがちゃんと動かなくなってしまったので、対策として作ってもらった ちょっと修正
このファイルのファイル名が
https://gyazo.com/7ca15ba79c22a4f334d6e1ff957af3f9
こんな感じにできる
https://gyazo.com/ce3f9f93a3cfc85efbcd64bc5be074c5
ファイルごとにユニークIDをつけるようにしました
code:python
import os
import hashlib
# ファイル名を最大長に切り詰める関数
def truncate_filename(filename, max_length):
# ファイル名から無効な文字を削除する関数
def remove_invalid_chars(filename):
invalid_chars = '<>:"/\\|?*\n\t '
return ''.join(if char in invalid_chars else char for char in filename)
# ファイル内容からSHA-256ハッシュ値の最初の8文字を生成する関数
def generate_hash(content):
sha = hashlib.sha256()
sha.update(content.encode('utf-8'))
# 指定されたエンコーディングでファイルを開こうとする関数
def try_open_with_encodings(file_path, encodings):
for encoding in encodings:
try:
with open(file_path, 'r', encoding=encoding) as file:
content = file.read()
return content
except UnicodeDecodeError:
continue
return None
# 自分のローカルフォルダのフォルダーパスを指定する
folder_path = 'フォルダーパスを入れる'
max_filename_length = 200
for filename in os.listdir(folder_path):
if not filename.endswith('.txt'):
continue
file_path = os.path.join(folder_path, filename)
file_content = try_open_with_encodings(file_path, encodings_to_try)
if file_content is None:
print(f"Error decoding file {filename}. Skipping...")
continue
first_twenty_lines = ' '.join([line.strip() for line in file_content.splitlines():20]) first_twenty_lines = remove_invalid_chars(first_twenty_lines)
truncated_filename = truncate_filename(first_twenty_lines, max_filename_length)
# ファイル内容からハッシュを生成
content_hash = generate_hash(file_content)
# ファイル名にハッシュの最初の8桁を追加
unique_filename = f"{truncated_filename}_{content_hash}.txt"
new_filename = os.path.join(folder_path, unique_filename)
# ファイル名が既に存在しない場合のみリネーム
if not os.path.exists(new_filename):
os.rename(file_path, new_filename)
else:
print(f"File {filename} has not changed. Skipping renaming.")