ふぁいる整理の 日々 つづき
60年 たまりにたまった
ふぁいる!
日々
お掃除中
さて
ごみのようま
ファイルサイズ
を 集めた!
10ばいといかの
ふぁいるの しょうたいは
なに???
開いてみる
空っぽである!
なぜ???
からっぽ 削除
すくりぷと で
削除できない???
【chatGPT】様に
なんでやねん!
必殺技 を 伝授される
# ==== 【chatGPT】様
結論から言うと、それは**「見えない文字だけが入っている」状態**です。壊れてるわけじゃなくて、ちゃんと中身はあります。
よくある正体はこのあたり👇
### ■ よくある原因
#### ① BOM(バイトオーダーマーク)
* UTF-8などのテキストの先頭に入る「目印」
* 表示されないけどデータとしては存在する
例:
* 3バイト → UTF-8のBOM(EF BB BF)
* メモ帳では普通見えない
👉 **3バイトの正体はほぼコレ**
#### ② 改行コードだけ
* LF(`\n`)→ 1バイト
* CR+LF(`\r\n`)→ 2バイト
👉 「空に見えるけど改行だけある」
#### ③ NULL文字や制御文字
* `0x00`(NULL)とか
* 表示されない特殊文字
👉 1バイトなのに何も見えないパターン
### ■ 確認方法(確実)
#### 方法①:PowerShell
```powershell
Format-Hex abc.txt
```
これで中身の正体が丸見えになります
# ==============================
やってみる
なるほど・・・
じゃあじゃあ
からっぽ ふぁいる 強制移動
すくりぷと
改造してくれ!
# ==============================
【chatGPT】様
いいですね、その方向ならかなり“事故りにくい”仕上がりにできます 👍
余計な拡張子も排除して、**テキストだけ厳密に判定**する版を丸ごと出します。
そのままコピペOKです👇
```python
import os
import shutil
# =========================
# 設定
# =========================
# 「テキストとして扱う拡張子」だけに限定
TEXT_EXTENSIONS = {
'.txt', '.csv', '.tsv', '.log',
'.ini', '.cfg', '.json', '.xml',
'.html', '.htm'
}
# 空とみなすバイト
INVISIBLE_BYTES = {0x00, 0x1A, 0x0A, 0x0D} # NULL / EOF / LF / CR
# =========================
# 判定ロジック
# =========================
def is_effectively_empty_text(file_path):
"""見えない文字だけなら空とみなす(安全版)"""
try:
size = os.path.getsize(file_path)
# 完全に空
if size == 0:
return True
# 念のためサイズ制限(巨大ファイル事故防止)
if size > 1024 * 1024: # 1MB以上は対象外
return False
with open(file_path, 'rb') as f:
data = f.read()
# UTF-8 BOMのみ
if data == b'\xEF\xBB\xBF':
return True
# すべて不可視文字なら空扱い
for b in data:
if b not in INVISIBLE_BYTES:
return False
return True
except Exception as e:
print(f"[ERROR] 判定失敗: {file_path} ({e})")
return False
# =========================
# ファイル移動
# =========================
def move_file_safe(src_file, dest_folder):
"""安全にリネームしながら移動"""
os.makedirs(dest_folder, exist_ok=True)
base_name = os.path.basename(src_file)
dest_file = os.path.join(dest_folder, base_name)
if not os.path.exists(dest_file):
shutil.move(src_file, dest_file)
print(f"[MOVE] {src_file} -> {dest_file}")
return
# 重複時リネーム
name, ext = os.path.splitext(base_name)
count = 1
while True:
new_name = f"{name}_{count}{ext}"
new_path = os.path.join(dest_folder, new_name)
if not os.path.exists(new_path):
shutil.move(src_file, new_path)
print(f"[MOVE] {src_file} -> {new_path}")
return
count += 1
# =========================
# メイン処理
# =========================
def process_files(src_folder, dest_folder):
"""安全版:拡張子なし + 空テキストのみ移動"""
for root, dirs, files in os.walk(src_folder):
for file in files:
file_path = os.path.join(root, file)
_, ext = os.path.splitext(file)
ext = ext.lower()
# (1) 拡張子なし → 無条件移動
if ext == '':
move_file_safe(file_path, dest_folder)
continue
# (2) テキストだけ対象
if ext in TEXT_EXTENSIONS:
if is_effectively_empty_text(file_path):
move_file_safe(file_path, dest_folder)
# =========================
# 実行
# =========================
if __name__ == "__main__":
SRC_FOLDER = r"E:\__WORK"
DEST_FOLDER = r"E:\__WORK-MOVE-ZERO"
process_files(SRC_FOLDER, DEST_FOLDER)
print("=== 完了 ===")
```
## ■ この版のポイント(重要)
👉 かなり安全寄りにしてあります
### ✔ テキストだけ判定
* `.jpg`, `.bmp` → **完全除外**
* もう巻き込まない
### ✔ 見えないゴミは空扱い
* `0x1A`(今回のやつ)OK
* 改行だけOK
* BOMだけOK
### ✔ 巨大ファイル防御
```python
if size > 1MB → 判定しない
```
👉 誤爆防止
### ✔ リネーム安全
* `file.txt`
→ `file_1.txt`, `file_2.txt`
## ■ もしさらに詰めるなら
* 「ログだけ対象にしたい」
* 「特定フォルダ除外したい」
* 「削除 instead of 移動」
全部いけます 👍
これでたぶん
👉 **“空っぽ風ファイル掃除”は完成形に近い**
動かしてみて、変な動きあればそこピンポイントで潰しましょう 😄
# ==============================
めでたしめでたし
じじぃ~