Dimora to xlsx (3)
ぶるれこ様の
データを
なるべく
手間を かけないで!
xlsxで 読み込めるようにする
以前も 作ったけど・・・
ぜんめんりにゅ~ある である
製作:Microsoft Copilot様
OnLineBackUp で ありんす♪
# ==== csv to pandas to xlsx 変!
# 2. 「録画先」列をチェックして **本体** と **USB-HDD** に分ける
# 3. それぞれを Excel (`.xlsx`) に出力
# - 本体 → `recList-本体.xlsx`
# - USB-HDD → `recList-USB.xlsx`
# 4. タイトル行(カラム名)は両方のファイルに必ず含める
# 5. 出力形式は UTF-8 → Excel形式(openpyxlで後処理可能)
## 📂 完成版コード例:`3-reclist_pandas_xlsx.py`
import pandas as pd
import os
# === 定数 ===
BASE_DIR = r"F:\_pypy\DIGA\COPY"
INPUT_FILE = os.path.join(BASE_DIR, "recList.csv")
OUTPUT_FILE_MAIN = os.path.join(BASE_DIR, "recList-本体.xlsx")
OUTPUT_FILE_USB = os.path.join(BASE_DIR, "recList-USB.xlsx")
def split_and_export(input_file, output_main, output_usb):
try:
# CSV読み込み(カラム行あり)
df = pd.read_csv(input_file, encoding="utf-8")
# ==== ここから
# 列の削除: 複数列を削除する場合は drop を使用
df = df.drop(columns=["DMR-", "視聴/未"])
# 列の挿入: insert を使う(位置を指定して1列ずつ)
# 例: 先頭に「行」列を追加(値は空文字)
df.insert(0, "行", "")
df.insert(1, "頁", "")
df.insert(2, "時間", "")
df.insert(3, "ももんが", "")
# 列の並べ替え: DataFrame の列をリストで再指定
df = df[[
"□放送開始日時□",
"□放送局□",
"☆番組タイトル☆",
"行", "頁", "分", "時間", "MODE", "ジャンル", "録画先"
]]
# ==== ここまで
# 「録画先」が本体の行を抽出
df_main = df[df["録画先"] == "本体"].copy()
# 連番付与(1から開始)
df_main["行"] = range(1, len(df_main) + 1)
# 「頁」列を数値形式で 1 で埋める
df_main["頁"] = 1
# 「録画先」がUSB-HDDの行を抽出
df_usb = df[df["録画先"] == "USB-HDD"].copy()
# 連番付与(1から開始)
df_usb["行"] = range(1, len(df_usb) + 1)
# 「頁」列を数値形式で 1 で埋める
df_usb["頁"] = 1
# 列の並べ替え(存在する列だけを安全に並べ替え)
desired_cols = [
"□放送開始日時□",
"□放送局□",
"☆番組タイトル☆",
"行", "頁", "時間", "MODE", "ジャンル", "分", "録画先"
]
df_main = df_main[[c for c in desired_cols if c in df_main.columns]]
df_usb = df_usb [[c for c in desired_cols if c in df_usb.columns]]
# Excel出力(タイトル行=カラム名を含む)
if not df_main.empty:
df_main.to_excel(output_main, index=False, engine="openpyxl")
print(f"出力完了: {output_main}")
else:
print("本体データがありません")
if not df_usb.empty:
df_usb.to_excel(output_usb, index=False, engine="openpyxl")
print(f"出力完了: {output_usb}")
else:
print("USB-HDDデータがありません")
except FileNotFoundError:
print(f"入力ファイルが見つかりません: {input_file}")
except Exception as e:
print(f"エラー発生: {e}")
if __name__ == "__main__":
split_and_export(INPUT_FILE, OUTPUT_FILE_MAIN, OUTPUT_FILE_USB)
## ✅ このスクリプトの動き
# - `recList.csv` を pandas で読み込む
# - 「録画先」列を基準にフィルタリング
# - 本体用とUSB用に分けて `.xlsx` 出力
# - 出力ファイルには必ずカラム行(タイトル行)が含まれる
# これで **第三弾の仕様**は完成です!
# 👉 次のステップでは、openpyxlを使って「セルの書式設定」や「シートの加工」も可能になります。
# 試しにこのコードを走らせてみますか?
# ==============================
Dimora to xlsx (2)
ぶるれこ様の
データを
なるべく
手間を かけないで!
xlsxで 読み込めるようにする
以前も 作ったけど・・・
ぜんめんりにゅ~ある である
製作:Microsoft Copilot様
OnLineBackUp で ありんす♪
# ==== tsv to csv & replace 変!
import os
# === 定数 ===
BASE_DIR = r"F:\_pypy\DIGA\COPY"
TSV_FILE = os.path.join(BASE_DIR, "recList.tsv")
OUTPUT_FILE = os.path.join(BASE_DIR, "recList.csv")
# 置換ルール(例)
REPLACEMENTS = {
"録画時間 (分)": "分",
"録画モード": "MODE",
"未視聴": "未",
"放送局名": "□放送局□",
"放送開始日時": "□放送開始日時□",
(中略)
"15倍録": "x15",
"10倍録": "x10",
"8倍録": "x8",
"4倍録": "x4",
"3倍録": "x3",
"1.5倍録": "x1.5",
}
def replace_strings(text: str, replacements: dict) -> str:
"""文字列置換をまとめて実施"""
for old, new in replacements.items():
text = text.replace(old, new)
return text
def tsv_to_csv(tsv_path: str, csv_path: str, replacements: dict):
"""TSVを読み込み、置換してCSVに保存"""
try:
with open(tsv_path, "r", encoding="utf-8") as f:
content = f.read()
# 文字列置換
replaced = replace_strings(content, replacements)
# TSV → CSV(タブをカンマに変換)
csv_content = replaced.replace("\t", ",")
# 出力
with open(csv_path, "w", encoding="utf-8", newline="") as f:
f.write(csv_content)
print(f"変換完了: {tsv_path} → {csv_path}")
except FileNotFoundError:
print(f"ファイルが見つかりません: {tsv_path}")
except Exception as e:
print(f"エラー発生: {e}")
if __name__ == "__main__":
tsv_to_csv(TSV_FILE, OUTPUT_FILE, REPLACEMENTS)
## ✅ このスクリプトの動き
# 1. `F:\_pypy\DIGA\COPY\recList.tsv` を読み込む
# 2. `REPLACEMENTS` に従って文字列を一括置換
# 3. タブ区切りをカンマ区切りに変換
# 4. `recList.csv` としてUTF-8で保存
# 💡 ポイント
# - 置換ルールは `REPLACEMENTS` にどんどん追加できます
# - TSVのタブ区切りをそのままカンマに変換しているので、Excelなどで開くとCSVとして認識されます
# - 出力ファイルは **同じフォルダに `recList.csv`** が生成されます
# これで「第2弾」仕様は完成です!
# 👉 次のステップとしては、置換ルール(大量にあるとのこと)を別ファイルにまとめて管理する方法も便利ですが、まずはこの形で動かしてみますか?
# ==============================
Dimora to xlsx (1)
ぶるれこ様の
データを
なるべく
手間を かけないで!
xlsxで 読み込めるようにする
以前も 作ったけど・・・
ぜんめんりにゅ~ある である
製作:Microsoft Copilot様
OnLineBackUp で ありんす♪
# ==== copy & move 変!
import shutil
import glob
import os
from datetime import datetime
# 元のファイルがあるディレクトリ
source_dir = r"C:\Users\piyop\Downloads"
# コピー先ディレクトリ(処理用)
copy_base = r"F:\_pypy\DIGA\COPY"
# 移動先ディレクトリ(バックアップ用)
move_dest = r"F:\_pypy\DIGA\MOVE"
# ファイル名パターン
pattern = "recList-*.tsv"
# ダウンロードフォルダから対象ファイルを取得
file_list = glob.glob(os.path.join(source_dir, pattern))
if not file_list:
print("対象ファイルが見つかりませんでした。")
else:
# 最新ファイルを選択
latest_file = max(file_list, key=os.path.getmtime)
basename = os.path.basename(latest_file)
print(f"対象ファイル: {basename}")
# COPYフォルダに日付フォルダを作成(空フォルダのみ)
dt_str = datetime.now().strftime("%Y%m%d_%H%M%S")
copy_subdir = os.path.join(copy_base, dt_str)
os.makedirs(copy_subdir, exist_ok=True)
print(f"空フォルダ作成: {copy_subdir}")
# コピー先ファイル(リネームして recList.tsv)
copy_target = os.path.join(copy_base, "recList.tsv")
os.makedirs(copy_base, exist_ok=True)
try:
shutil.copy(latest_file, copy_target)
print(f"Copied: {basename} → {copy_target}")
except Exception as e:
print(f"Copy failed: {e}")
# MOVE処理(元のファイル名のままバックアップ)
os.makedirs(move_dest, exist_ok=True)
move_target = os.path.join(move_dest, basename)
try:
shutil.move(latest_file, move_target)
print(f"Moved: {basename} → {move_target}")
except Exception as e:
print(f"Move failed: {e}")
# ==============================


