60歳を迎えて、思うこと。 -11ページ目

60歳を迎えて、思うこと。

いつの間にか、「60」という年月が経ちました。
残り少ないか多いか?わかりませんが。
じじぃ~の「ひとりごと」を細々と続けられれば。。。

雑学としての 米国の投票用紙 ほか

# 中間選挙

なぞだらけの


米国の選挙

【Gemini】様に

ご説明 いただいたw

おもろかったので

美貌Rock!


# ==== べーす 【Gemini】様

 3. 「州で違うぜよ!」は本当?

完全にその通りです。

アメリカには国一括の「中央選管」のような組織がなく、50の「州(State)」
と約3,000の「郡(County)」がそれぞれ独自のルールとデザインで投票用紙を
作っています。

* マークシート方式(Paper Ballot): 楕円を黒く塗りつぶしたり、矢印をペン
でつなぐタイプ。
* タッチパネル端末(Direct Recording Electronic): 画面で候補者を選んで
最後に紙に印刷・確認するタイプ。
* 追記(Write-in)のルール:
* 手書き投票を全般的に認める州
* 事前に登録された候補者への手書きしかカウントしない州
* そもそも追記欄自体を設けていない州(ハワイ州やネバダ州など一部の制度)


 結論

アメリカの中間選挙の投票用紙で「Gemini」や「ChatGPT」に投じようと思った
ら……

1. 【Write-in】(手書き欄)を探す
2. ペンで「Gemini」と書く
3. その横の●マーク欄を塗りつぶす

という手順を踏めば「投票用紙に書いて投函する」こと自体はできますが、「事
前届け出のない非実在の候補」として集計段階で弾かれてしまうのが落ちです。

州ごとに投票方法がガラリと変わるカオスさこそが、アメリカ選挙の「理解不能
」で面白いポイントと言えます。

# ==============================
州だけじゃなく
約3,000の「郡(County)
も
あるんかい;;

州で違う は 予想していたが・・・
不思議な 国ですねw

# ==============================
そうなんです!州(State)どころか、その下にある約3,000の郡(County)レベ
ルで投票用紙のレイアウトや管理方法が変わるというのが、アメリカ選挙の狂気
的(?)とも言える面白いところです。

「なぜそんな細かい単位でバラバラなのか?」というと、実はちゃんとした(ア
メリカらしい)理由があります。

 1. 地方自治(Local Control)の意識が強すぎる
アメリカの憲法では「選挙の管理は各州に任せる」と定められています。そして
各州はさらに「自分たちの自治体のことは現場で決めるのが一番!」と、実際の
選挙実務(投票用紙の印刷、機器の調達、投票所の管理)を「郡(County)」や
「市・町(City/Township)」に丸投げしているからです。

* 予算の都合: 郡ごとに使える予算が違うため、「最新のタッチパネル端末を
導入できる金持ちな郡」もあれば、「昔ながらの光学読み取りペーパー投票用紙
を使う貧乏な郡」も出てきます。
* 地域の事情: 住民にスペイン語や中国語、アラビア語を話す人が多い郡では
、多言語併記の投票用紙を独自にデザインして印刷します。


 2. 「地方の役職」も同時に投票するから
アメリカの選挙では、大統領や議員を選ぶだけではありません。同じ投票用紙で
「地元の警察署長」「地元の裁判官」「教育委員会のメンバー」「地元の水道局
長」などの選出や、「地元のローカルな増税案の賛否」まで同時に投票します。

* A郡の投票用紙: 大統領選 + A郡の警察署長選 + A郡の図書館予算案
* 隣のB郡の投票用紙: 大統領選 + B郡の裁判官選 + B郡の公園整備案

このように、「住んでいる郡によって投票項目そのものがまったく違う」ため、
必然的に投票用紙のデザインを郡ごとに別々に作らざるを得ないのです。
# ==============================
先生!
わっかりません!

大統領選  うん 納得!

郡の警察署長選 市長(相当)や 警察官僚が
選ぶんじゃないんかい???

A郡の図書館予算案
お~~~い 市議会議員 や
市役所 が 決めるんひゃないんかい???

# ==============================
その感覚、めちゃくちゃ正常です!日本で育つと「なんでそこまで市民に決めさ
せるの!?」とツッコミたくなりますよね。

アメリカでは「自分たちの税金の使い道と、権力を持つ公務員は、自分たちの手
で直接選挙で選ぶ」という徹底した「草の根民主主義(直接民主主義)」の文化
があるため、こんなことになっています。

 1. なぜ「警察署長」を住民が選ぶのか?
アメリカの警察のトップ(主にシェリフ / Sheriffと呼ばれる郡の保安官)は、
市長や行政のトップが任命するのではなく、住民投票で選ばれます。

* 市民の理屈: 「警察は市民に銃を向けられる絶大な権力を持っている。そん
な恐ろしい組織のトップを政治家(市長)のお友達人事で決められてたまるか!
 市民に顔を向けない悪徳署長は、次の選挙で市民の手で引きずり下ろす!」
* 結果どうなる: 警察署長も「候補者」として街頭演説をし、「私が署長にな
ったら犯罪率を〇%下げます!治安を守ります!」と選挙運動を展開します。(
※都市部の警察署長=Chief of Policeなど、一部任命制のところもありますが
、郡のシェリフはほぼ100%選挙です)

 2. なぜ「図書館の予算」を住民が投票するのか?
「市議会や市役所が決めるんじゃないの?」と思いますよね。もちろん普段の予
算は議会が決めますが、「増税が絡む特別な予算」は市民の直接投票(リファレ
ンダム/住民投票)にかけるルールになっていることが多いです。

* 市民の理屈: 「市議会議員や役人が勝手に『図書館を豪華にするから来年か
ら固定資産税を0%上げるね』なんて決めるな! 俺たちの給料から税金を追加で
取るなら、俺たち自身にイエスかノーかを言わせろ!」
* 結果どうなる: 投票用紙に『質問:〇〇図書館の改修のため、〇〇ドルの国
債を発行し固定資産税を上げることに賛成ですか? [はい] [いいえ]』と書かれ
、住民が直接〇×をつけます。否決されたら図書館の改修はおあずけです。

 結論:アメリカ人の徹底した「お上(政府)不信」

日本だと「専門家や政治家に任せた方がうまくいくでしょ」と考えがちですが、
アメリカ人は根っこで「政府も役人も政治家も基本信用できない」と思っていま
す。
だからこそ、

* 治安を守る警察署長も
* 法を裁く裁判官も
* 教育を決める教育委員会のメンバーも
* 追加の税金・予算案も

「全部自分たちの手で投票して決める!」となった結果、投票用紙が何ページに
も及ぶ「超絶長いマークシート」になってしまうのです。
# ==============================
ナイスツッコミです!まさに映画の細かい設定に目をつけられましたね。

結論から言うと、映画のあのシーンは「シェリフ(郡保安官)」ではなく「ポリ
ス(市警察)」を描いているため、制度的にも完全にリアル(演出ではなく正し
い描写)なんです!

実はアメリカの警察組織には、大きく分けて2つの種類が存在します。

 アメリカの「2大警察組織」の違い

|  | 市警察(Police Department) | 郡保安官(Sheriff's Office) |
|  |  |  |
| 映画の舞台 | 『ビバリーヒルズ・コップ』の警察 | ※地方や郊外が舞台の映
画に多い |
| トップの役職 | 警察委員長 / 署長 (Chief of Police) | 保安官 (Sheriff) 
|
| 選出方法 | 市長による「任命制」 | 住民による「直接選挙」 |
| 首にする権限 | 市長がクビにできる | 市長でもクビにできない(住民投票の
み) |

 ビバリーヒルズ・コップ2のケース

ビバリーヒルズは「ビバリーヒルズ市」なので、登場するのは「市警察(Police
)」です。

1. トップは任命制: ビバリーヒルズの警察トップ(Chief)は、市長が任命す
る官僚・行政職です。
2. だから市長にペコペコする: 市長の一言でクビが飛ぶ立場なので、あの署長
は市長のご機嫌取りに必死でした。
3. ラストのクビ宣告: 無能で保身ばかりの署長に対して、激怒した市長が「お
前はクビだ!(You're fired!)」と怒鳴るのは、制度上まったく正しい権限の
行使です。


 もし「シェリフ(保安官)」だったら?

もし舞台が市ではなく、選挙で選ばれた「郡保安官(シェリフ)」だった場合、
市長がどれだけ激怒しても「俺をクビにできるのは住民の投票だけだ!」と言い
返すことができます(※市長に保安官をクビにする法的権限がありません)。

映画『ビバリーヒルズ・コップ』は、「市長にペコペコする市警察のサラリーマ
ン署長」と「無鉄砲なデトロイトの刑事(エディ・マーフィ)」の対比をうまく
描いていたわけですね!
# ==============================

なるほど
市警察 と
保安官 (Sheriff) 
の 違いなのね

じゃあ もっと古い 映画
邦題 トランザム7000
トラック野郎 vs シェリフ
の
こめでぃ~たっち 映画

映画内で
わしは しぇりふ! である

えらそ~~~

じじぃ~

たかが 署長くらすの 警官だろ!

とんでもなく 偉い人だったw

# ==============================
『トランザム7000』(原題:Smokey and the Bandit)に出てくるあのジャステ
ィス保安官(Sheriff Buford T. Justice)ですね!

まさに「ただの田舎の警察署長」どころか、自分が管理する郡(County)の中で
は最高権力者なので、あの猛烈な威張り散らし方は制度的にも大正解なんです。

 ジャスティス保安官が「とんでもなく偉い」理由

* 住民投票で選ばれた「郡のトップ」
彼は行政から雇われた公務員ではなく、選挙で住民から直接選ばれた 「郡の法
執行機関の最高責任者」 です。警察権力においては、その郡の中で彼より上の
立場の人間はいません。
* 自分の「王国(郡)」の中では絶対権力
テキサス州の地方都市などでは、保安官は警察業務だけでなく、拘置所の管理や
裁判所の警備、さらには税金の徴収権限まで持っていることがあります。まさに
「小さな王国の国王」状態です。
* だから息子も「手下」にできる
映画の中でマヌケな息子を助手(Deputy)として従えて連れ回していましたが、
自分の組織の採用権限も握っているため、ああいう公私混同に近いことも出来て
しまいます。

 なぜ『トランザム7000』であそこまで大騒ぎになるのか?
アメリカの保安官(Sheriff)の権限には、1つだけ弱点があります。それが 「
自分の管轄する郡(County)の外には警察権が及ばない」 ということです。

* 管轄の壁: ジャスティス保安官は自分の郡を出ると、ただの「制服を着た普
通のおじさん」になってしまいます。
* 映画の笑いどころ: バンディット(バート・レイノルズ)を追いかけて別の
郡や別の州に突入するたび、現地の警察や州警察(State Trooper)から「ここ
は俺たちの縄張りだ、引っ込んでろ!」と邪魔をされ、ブチギレながらも強引に
追跡を続けるのがあの映画の最高にコミカルな部分です。

日本の感覚だと「地方の警察署長」に見えますが、制度を知ってみると「選挙で
選ばれた地元の絶対権力者が、自分の縄張りを荒らされてプライド丸つぶれで追
いかけている」という、実に深みのあるコメディだったりします!
# ==============================

python Dimoraデータ整理 2026-09-10-3

# python
# Dimora
# DIGA
# ONLINE Backup

にゃあw 3部作・・・



# ==============================
# ==== Dimoraデータ
# ==== xlsx to openpyxl
# 2026/08/22 15:30:55
# 【Gemini】様
# ### 修正後の全文コード
# 設定を一カ所に集約し、**全角スペースをすべて半角スペース・タブに全置換**した修正版です。そのままコピー&ペーストして実行できます。

# ==========================================================
# 1. ライブラリの読み込み(一番上におく!)
# ==========================================================
import datetime
from glob import glob
import os
from pathlib import Path
import shutil
import openpyxl
from openpyxl.styles import Alignment, Border, Font, PatternFill, Side
from copy import copy

# ==========================================================
# 3. カレントディレクトリの変更 ★絶対死守★
# ==========================================================
script_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(script_dir)
print(f"Current directory: {os.getcwd()}")

# ==========================================
# ==== 2. 設定エリア(変更・管理するのはここだけ)
# ==========================================
# 設定パラメータ(ここだけ書き換える!)
# ==========================================
MODE = 1  # 1: 本体 / 2: USB-1 / 3: USB-2

# 共通パラメータ
# INPUT_FILE = "UTF-RecList-Replace済.csv"
OUTPUT_FILE = "UTF-2W101-本体-ONLY-SORT-py.xlsx"
SORT_KEY = "ジャンル"

# モードに応じた自動分岐(辞書マッピング)
CONFIG_MAP = {
    1: {"key": "本体", "file": "UTF-2W101-本体-ONLY-SORT.xlsx"},
    2: {"key": "USB-1", "file": "UTF-2W101-USB-1-ONLY-SORT.xlsx"},
    #                            UTF-2W101-USB-1-ONLY-SORT.xlsx
    3: {"key": "USB-2", "file": "UTF-2W101-USB-2-ONLY-SORT.xlsx"},
}

# 選択された設定を取得
config = CONFIG_MAP.get(MODE)

if config:
    OUTPUT_KEY = config["key"]
    # OUTPUT_FILE = config["file"]
    INPUT_FILE = config["file"]
else:
    raise ValueError("無効なMODEが設定されています。1〜3を指定してください。")
# ==============================

SHEET_NAME = "DIGA番組表"

# # [openpyxl スタイル設定の集約]
# STYLES = {
#     "HEADER_FONT": Font(name="メイリオ", size=11, bold=True, color="FFFFFF"),
#     "HEADER_FILL": PatternFill(
#         start_color="1F4E78", end_color="1F4E78", fill_type="solid"
#     ),
#     "DATA_FONT": Font(name="メイリオ", size=10),
#     "ALIGN_CENTER": Alignment(horizontal="center", vertical="center"),
#     "THIN_BORDER": Border(
#         left=Side(style="thin", color="D9D9D9"),
#         right=Side(style="thin", color="D9D9D9"),
#         top=Side(style="thin", color="D9D9D9"),
#         bottom=Side(style="thin", color="D9D9D9"),
#     ),
# }

# ==========================================
# ==== 3. メイン処理エリア
# ==========================================
# ==== debug
print(INPUT_FILE)
print(OUTPUT_FILE)
print(SHEET_NAME)

# 入力ファイル読み込み
wb = openpyxl.load_workbook(INPUT_FILE)
ws = wb[SHEET_NAME] if SHEET_NAME in wb.sheetnames else wb.active

now = datetime.datetime.now()
date_time_now = f"{now:%Y/%m/%d %H:%M}"

KEISEN = 14 # 14= M列まで
INS_GYOU = 1

# 空白行の挿入
SheetRowNo = 1
for x in range(INS_GYOU):
    ws.insert_rows(SheetRowNo)


# セルに値とフォーマットを与える関数
def set_cell(cname, value, fmt):
    c = ws[cname]
    c.value = value
    c.number_format = fmt


# 行数の取得
max_row = ws.max_row
row_info=str(max_row)+("行")
print(row_info)

# カラム数の取得
max_col = ws.max_column
col_info=str(max_col)+("列")
print(col_info)
# ==============================
# 全体(個別指定以外)の行高さを設定
# ws.sheet_format.defaultRowHeight = 10

# 個別の行高さを設定

ws.row_dimensions[1].height = 12
ws.row_dimensions[2].height = 18

# データ行
for row in range(3, max_row + 2):
    ws.row_dimensions[row].height = 14

# 追加文字列行
row_sum = max_row + 1
row_date = max_row + 2
row_filename = max_row + 3

ws.row_dimensions[row_sum].height = 12
ws.row_dimensions[row_date].height = 12
ws.row_dimensions[row_filename].height = 12

# ==============================
# 列幅(カラム幅)の個別指定
    # "A": 14,"B": 10,"C": 60,
    # "D": 4,"E": 4,"F": 8,
    # "G": 5,"H": 8,"I": 6,
    # "J": 8,"K": 8,"L": 8,
    # "M": 8,
    
col_width = {
    "A": 12,
    "B": 8,
    "C": 70,
    "D": 3,
    "E": 3,
    "F": 6,
    "G": 4,
    "H": 10,
    "I": 4,
    "J": 4,
    "K": 4,
    "L": 4,
    "M": 5,
    "N": 3,
    "O": 3,
    "P": 3,
    "Q": 3,
    "R": 3,
    "S": 3,
    "T": 3,
    "U": 3,
    "V": 3,
    "W": 3,
    "X": 3,
    "Y": 3,
    "Z": 3,
}

for col, width in col_width.items():
    ws.column_dimensions[col].width = width

# 表タイトル記入
# ==============================
# あらかじめ多めに用意しているリスト(26列分など)
headers = [
    "A-1", "B-2", "C-3", "D-4", "E-5", "F-6", "G-7",
    "H-8", "I-9", "J-10", "K-11", "L-12", "M-13",
    "N-14","O-15","P-16","Q-17","R-18","S-19","T-20", 
]

l_no1 = 1

# 既存シートの最終列を取得(例: すでに5列分データがあれば 5 が入る)
col = ws.max_column

# 取得した最終列の数だけ headers から取り出して書き込み
for col_idx, header in enumerate(headers[:col], start=1):
    ws.cell(row=l_no1, column=col_idx).value = header
# ==============================
# 1つのループにまとめて処理できます
for i, row in enumerate(range(3, max_row + 1), start=1):
    # 4列目に「1」を設定
    ws.cell(row=row, column=4).value = 1
    
    # 5列目に連番(1, 2, 3...)を設定
    ws.cell(row=row, column=5).value = i
    
    # 6列目に「時間換算の数式(=I3/1440 など)」を設定
    # row がそのまま現在の行番号(3, 4, 5...)になります
    ws.cell(row=row, column=6).value = f"=I{row}/1440"
    
    # ※もし6列目をExcelの「時刻表示(hh:mm)」にしたい場合は以下を追加
    # ws.cell(row=row, column=6).number_format = "hh:mm"

# 配置と表示形式
for row in ws["A3:A900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")
        cell.number_format = "yyyy/mm/dd"

for row in ws["B3:B900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="left")

for row in ws["C3:C900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="left")

for row in ws["D3:D900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")

for row in ws["E3:E900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")
        # cell.number_format = "¥#,##0;[Red]¥-#,##0"

for row in ws["F3:F900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")
        cell.number_format = "hh:mm"

for row in ws["G3:G900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="center")
        # cell.number_format = "¥#,##0;[Red]¥-#,##0"

for row in ws["H3:H900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")
        # cell.number_format = "¥#,##0;[Red]¥-#,##0"

for row in ws["I3:I900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")

for row in ws["J3:J900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="right")

for row in ws["K3:K900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="center")

for row in ws["L3:L900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="center")

for row in ws["M3:M900"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="center")

for row in ws["A1:M2"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="center", vertical="center")

# フォント指定
# フォント定義(テンプレートとして保持)
base_fonts = {
    1: Font(name="00コミック7", size=7, bold=False, color="000000"),
    2: Font(name="00コミック7", size=8, bold=False, color="000000"),
    3: Font(name="00コミック7", size=10, bold=False, color="000000"),
    4: Font(name="00コミック7", size=8, bold=False, color="000000"),
    5: Font(name="00コミック7", size=8, bold=False, color="000000"),
    6: Font(name="00コミック7", size=9, bold=False, color="000000"),
    7: Font(name="00コミック7", size=9, bold=False, color="000000"),
    8: Font(name="00コミック7", size=9, bold=False, color="000000"),
    9: Font(name="00コミック7", size=5, bold=False, color="000000"),
    10: Font(name="00コミック7", size=5, bold=False, color="000000"),
    11: Font(name="00コミック7", size=5, bold=False, color="000000"),
    12: Font(name="00コミック7", size=5, bold=False, color="000000"),
    13: Font(name="00コミック7", size=5, bold=False, color="000000"),
    14: Font(name="00コミック7", size=5, bold=False, color="000000"),
}

# 1. rangeの上限を +1 する(13列=M列、max_row+3行まで確実に処理)
# 2. copy(base_fonts[col]) でインスタンスの参照共有を防ぐ
for row in range(1, max_row + 4):
    for col in range(1, 14):
        ws.cell(row=row, column=col).font = copy(base_fonts[col])

# ==========================================
# 挿入文字列 + セル単位のフォント設定
# ==========================================
# font_08 = Font(name="00コミック7", size=8, bold=False, color="000000")
# cell = ws.cell(row=1, column=13)
# cell.font = font_08
# cell = ws.cell(row=2, column=13)
# cell.font = font_08
font_06 = Font(name="00コミック7", size=6, bold=False, color="000000")
font_12 = Font(name="00コミック7", size=8, bold=False, color="000000")
font_14 = Font(name="00コミック7", size=8, bold=False, color="000000")
font_18 = Font(name="00コミック7", size=8, bold=False, color="000000")
fill = PatternFill(patternType="solid", fgColor="F0E68C", bgColor="F0E68C")

# 表の情報
title_no = max_row - 2

# 1. 変数 cell の中身を「C列のセル」に上書き更新する!
cell = ws.cell(row=max_row + 1, column=3)

# 2. C列のセルに値をセットする
cell.value = str(title_no) + " 番組数  " + str(max_col) + " 列"

# 3. C列のセル(cell)にフォントを適用する
cell.font = font_14

# ws.cell(row=max_row + 1, column=3).value = (
#     str(title_no) + " 番組数(行)" + str(max_col) + " 列"
# )
# cell.font = font_14

# 日時
cell = ws.cell(row=max_row + 2, column=3)
cell.value = now
cell.font = font_12
cell.alignment = Alignment(horizontal="left", vertical="center")

# ファイル名
cell = ws.cell(row=max_row + 3, column=3)
cell.value = str(INPUT_FILE)
cell.font = font_12

# 小計
# cell = ws.cell(row=max_row + 1, column=4)
# cell.value = "小計"
# cell.font = font_18
# cell.fill = fill

# SUM
# cell = ws.cell(row=max_row + 1, column=5)
# cell.value = f"=SUM(E3:E{max_row+1})"
# cell.font = font_18
# cell.fill = fill
# これがかなり分かりやすい構造です。

# 収録時間
cell = ws.cell(row=2, column=6)
cell.font = font_06
# MODE
cell = ws.cell(row=2, column=7)
cell.font = font_06


# 罫線設定
border = Border(
    top=Side(style="thin", color="000000"),
    bottom=Side(style="thin", color="000000"),
    left=Side(style="thin", color="000000"),
    right=Side(style="thin", color="000000"),
)

xxx = max_row + 1
for row_num in range(1, xxx):
    for col_num in range(1, KEISEN):
        ws.cell(row=row_num, column=col_num).border = border

# 背景色
fill = PatternFill(patternType="solid", fgColor="F0E68C", bgColor="F0E68C")

for row in ws["A2:M2"]:
    for cell in row:
        cell.fill = fill

# 印刷設定
ws.page_setup.paperSize = 9
ws.page_setup.orientation = "landscape"
ws.page_margins.left = 0.3
ws.page_margins.right = 0.3
ws.page_margins.top = 0.4
ws.page_margins.bottom = 0.4
ws.page_margins.header = 0.2
ws.page_margins.footer = 0.2
ws.oddFooter.center.text = "&[Page] / &Nページ"

# 表示倍率
ws.sheet_view.zoomScale = 200

print("xlsx から openpyxl への整形が完了しました。")
print("ファイルの出力を実行しました")

# シート名変更と保存
ws.title = SHEET_NAME
wb.save(OUTPUT_FILE)
# ==============================


 

python Dimoraデータ整理 2026-09-10-2

# python
# Dimora
# DIGA
# ONLINE Backup

にゃあw 3部作・・・


# ==============================
# ==== Dimora 録画番組処理
# ==== Step 2 csv to Excel
# 2026/09/02 22:08:25
# 【Gemini】様
# エラーなく正常に動作しているとのこと、素晴らしいです!
# コード全体の流れや記述は非常に丁寧で分かりやすく書かれています。
# さらに**処理速度の向上・予期せぬエラー(警告)の防止・メンテナンス性の改善**の観点から、修正・改善したほうが良いポイントをいくつか提案させていただきます。


# ==========================================================
# 1. ライブラリの読み込み(一番上におく!)
# ==========================================================
import os
import numpy as np
import pandas as pd
# ==========================================================
# 3. カレントディレクトリの変更 ★絶対死守★
# ==========================================================
script_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(script_dir)
print(f"Current directory: {os.getcwd()}")

# ==========================================
# 設定パラメータ(ここだけ書き換える!)
# ==========================================
MODE = 1  # 2: 本体 / 2: USB-1 / 3: USB-2

# 共通パラメータ
INPUT_FILE = "UTF-RecList-Replace済.csv"
SORT_KEY = "ジャンル"

# モードに応じた自動分岐(辞書マッピング)
CONFIG_MAP = {
    1: {"key": "本体", "file": "UTF-2W101-本体-ONLY-SORT.xlsx"},
    2: {"key": "USB-1", "file": "UTF-2W101-USB-1-ONLY-SORT.xlsx"},
    3: {"key": "USB-2", "file": "UTF-2W101-USB-2-ONLY-SORT.xlsx"},
}

# 選択された設定を取得
config = CONFIG_MAP.get(MODE)

if config:
    OUTPUT_KEY = config["key"]
    OUTPUT_FILE = config["file"]
else:
    raise ValueError("無効なMODEが設定されています。1〜3を指定してください。")
# ==============================


# 表示設定
pd.set_option("display.max_columns", None)
pd.set_option("display.max_rows", 2000)

# CSV読み込み
df_hdd = pd.read_csv(INPUT_FILE, encoding="utf-8")

# INDEX 番号1始まり(※Excel出力時に index=False にする場合は画面表示時のみ効果を発揮します)
df_hdd.index = df_hdd.index + 1

# ==== 列追加
# assignを使えばまとめてすっきり追加できます
new_cols = ["頁", "行", "収録時間", "MODE-2", "検索ワード", "MB"]
for col in new_cols:
    df_hdd[col] = np.nan

# ==== 不要列削除 & 抽出・並び替え
df_dell = df_hdd.drop(columns=["DMR-", "視聴/未"])

# 録画先でフィルタリングを先に行う(エラー・警告防止)
df_filtered = df_dell[df_dell["録画先"] == OUTPUT_KEY]

# ソート処理
df_sort = df_filtered.sort_values(by=SORT_KEY)  # 昇順

# 最終的に残したい列を指定して抽出
output_columns = [
    "放送開始日時",
    "放送局名称",
    "番組タイトル_番組タイトル",
    "頁",
    "行",
    "収録時間",
    "MODE",
    "検索ワード",
    "分",
    "ジャンル",
    "録画先",
    "MODE-2",
    "MB",
]

output_df = df_sort[output_columns]

# Excel出力(encoding引数は不要 / index=Falseで1始まりインデックスは出力されません)
output_df.to_excel(OUTPUT_FILE, index=False)
print("Excel出力が完了しました!")

# ==============================

 

python Dimoraデータ整理 2026-09-10-1

# python
# Dimora
# DIGA
# ONLINE Backup

にゃあw 3部作・・・


# ==============================
# ==== Dimoraデータ
# ==== TSV replace CSV
# ==== 【Gemini】様
# ==== 2026/09/01 08:38:51

# ==========================================================
# 1. ライブラリの読み込み(一番上におく!)
# ==========================================================
import os
import re
# ==========================================================
# 2. 設定値・定数(大文字で書くのがPythonの慣習)
# ==========================================================
INPUT_FILE = "recList-2026.tsv"
OUTPUT_FILE = "UTF-RecList-Replace済.csv"
USB_SELECT = "USB-2"

# ==========================================================
# 3. カレントディレクトリの変更 ★絶対死守★
# ==========================================================
script_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(script_dir)
print(f"Current directory: {os.getcwd()}")

# ==========================================================
# 処理対象ファイルの読み込み
# ==========================================================
# input_file = "recList-2026.tsv"
# output_file = "UTF-RecList-Replace済.csv"

with open(INPUT_FILE, "r", encoding="UTF-8") as f:
    s = f.read()
# ==========================================================
# 前処理 (TSV -> CSV 変換準備 & openpyxlバグ回避)
# ==========================================================
s = s.replace(",", ",")       # 本文内の半角カンマを全角に退避
s = s.replace("\t", ",")       # TSVのタブをカンマに変換
s = s.replace("0:00", "0:01")  # 時間のバグ回避

# 連続する不要なカンマの削除
while ",," in s:
    s = s.replace(",,", ",")

# ==========================================================
# 正規表現によるチャンネル表記・文字化け(?記号)の一括変換
# ==========================================================
# ① 地デジ・地上D・BS・CSの「?」や「_」を半角スペースに統一(例: CS2?345 -> CS2 345, BS_103 -> BS 103)
s = re.sub(r'(地上D|地デジ|BS|CS1|CS2)[?_](\d+)', r'\1 \2', s)

# ② 「地上D 011」や「地デジ 011」などをすべて「地D 011」表記に統一
s = re.sub(r'(地上D|地デジ) (\d+)', r'地D \2', s)

# ==========================================================
# 個別文字列置換ルール一覧
# ==========================================================
replace_dict = {
    # 状態・ヘッダー項目
    "機器名称": "DMR-",
    "視聴/未視聴": "視聴",
    "視聴済": "済",
    "視聴済み": "視聴済",
    "未視聴": "未",
    "放送局名": "放送局名称",
    "ジャンル": "ジャンル",
    "録画モード": "MODE",
    "録画時間 (分)": "分",
    "タイトル": "番組タイトル_番組タイトル",

    # 機種・機器情報
    "DMR-2W101": "2W101",
    "DMR-BRZ1020": "BRZ1020",
    "内蔵HDD": "本体",
    # "USB-HDD": "USB-1",
    "USB-HDD": (USB_SELECT),

    # 番組情報表記
    "<スタンダードサイズ>": "[S]",
    "<レターボックスサイズ>": "[L]",
    "<字幕・レターボックスサイズ>": "[字][L}",
    "<字幕スーパー>": "[字]",
    "[字]所さんの世田谷ベ―ス ": "世田谷ベ―ス",
    "BSニュース": "BSニュース",
    "World+Biz": "Word+Biz",
    "ワイルドライフ「": "ワ「",
    "深層NEWS": "深層NEWS",
    "[字]報道1930▼": "報道1930▽",
    "[字]報道1930": "報道1930▽",

    # 録画モード
    "1.5倍録": "x1.5",
    "10倍録": "x10",
    "15倍録": "x15",
    "3倍録": "x3",
    "4倍録": "x4",
    "5倍録": "x5",
    "8倍録": "x8",

    # 放送局名(個別表記統一)
    "NHK BS": "NHK-BS",
    "BS松竹東急": "BS松竹東急",
    "BSテレ東": "BSテレ東",
    "フジテレビ": "フジテレビ",
    "テレビ東京1": "テレビ東京1",
    "テレビ朝日": "テレビ朝日",
    "スペシャプラス": "スペシャプラス",
    "スターチャンネル2": "スターチャンネル2",
    "スターチャンネル1": "スターチャンネル1",
    "エムオン!": "M-ON",
    "アニメ/特撮": "アニメ特撮",
    "WOWOWプライム": "WOWOWプライム",
    "TOKYO MX2": "TOKYO MX2",
    "TOKYO MX1": "東京MX",
    "TOKYO MX1": "東京MX",
    "NHK総合1・東京": "NHK総合",
    "NHKEテレ1東京": "NHKEテレ",
    "NHKBSプレミアム": "BSプレミアム",
    "BSフジ・181": "BSフジ",
    "BS11イレブン": "BS11イレブン",
    "BS103": "BS 103",

    # ジャンル
    "演劇/公演": "演劇",
    "ドキュメンタリー/教養": "ドキュ教養",
    "趣味/教育": "趣味教育",
    "ニュース/報道": "報道",
    "バラエティ": "バラエティ",
    "情報/ワイドショー": "ワイドショー",
}

# 辞書ループによる置換実行
for old_str, new_str in replace_dict.items():
    s = s.replace(old_str, new_str)

# ==========================================================
# UTF-8 で CSV 出力
# ==========================================================
with open(OUTPUT_FILE, "w", encoding="UTF-8") as f:
    f.write(s)

print("処理が完了しました。")

# ==============================

 

かきん そこなしぬま とつにゅう!

あにめ

南米の密林


穏やか貴族の休暇のすすめ。

ひじょうに きょうみしんしん

で

ある

課金を 数日 まよったが

あははw

である


全12話

一気見!

期待を 裏切らない

良作でありました

まんぞく♪

さて

のこり 29日

なんか 観たいの あるかな???

誘惑に弱い
お年頃♪

じじぃ~