Files
2025-10-05 17:37:51 +09:00

110 lines
3.3 KiB
Python

from __future__ import annotations
import os
from pathlib import Path
import pandas as pd
# ---------------------------------------------
# Cross-platform paths (Windows & Linux/Mac)
# ---------------------------------------------
def resolve_data_root() -> Path:
"""
Priority:
1) Env var IDRAC_DATA_DIR (absolute/relative OK)
2) nearest parent of this file that contains a 'data' folder
3) ./data under current working directory
"""
env = os.getenv("IDRAC_DATA_DIR")
if env:
return Path(env).expanduser().resolve()
here = Path(__file__).resolve()
for p in [here] + list(here.parents):
if (p / "data").is_dir():
return (p / "data").resolve()
return (Path.cwd() / "data").resolve()
DATA_ROOT = resolve_data_root()
SERVER_LIST_DIR = DATA_ROOT / "server_list"
SERVER_LIST_FILE = SERVER_LIST_DIR / "server_list.txt"
MAC_TXT_DIR = DATA_ROOT / "mac"
OUTPUT_XLSX = DATA_ROOT / "idrac_info" / "mac_info.xlsx"
# Ensure output directory exists
OUTPUT_XLSX.parent.mkdir(parents=True, exist_ok=True)
# ---------------------------------------------
# Helpers
# ---------------------------------------------
def read_lines_any_encoding(path: Path) -> list[str]:
"""Read a text file trying common encodings (handles Windows & UTF-8)."""
encodings = ["utf-8-sig", "utf-8", "cp949", "euc-kr", "latin-1"]
for enc in encodings:
try:
with path.open("r", encoding=enc, errors="strict") as f:
return f.read().splitlines()
except Exception:
continue
# last resort with replacement
with path.open("r", encoding="utf-8", errors="replace") as f:
return f.read().splitlines()
# ---------------------------------------------
# Load server list (file names without .txt)
# ---------------------------------------------
if not SERVER_LIST_FILE.is_file():
raise FileNotFoundError(f"server_list.txt not found: {SERVER_LIST_FILE}")
file_names = read_lines_any_encoding(SERVER_LIST_FILE)
data_list: list[str] = []
index_list: list[int | str] = []
sequence_number = 1
for name in file_names:
# normalize and skip blanks
base = (name or "").strip()
if not base:
continue
txt_path = MAC_TXT_DIR / f"{base}.txt"
if not txt_path.is_file():
# if a file is missing, keep row aligned with an empty line
data_list.append("")
index_list.append("")
continue
lines = read_lines_any_encoding(txt_path)
for line in lines:
cleaned = (line or "").strip().upper()
if cleaned:
data_list.append(cleaned)
if len(cleaned) == 7:
index_list.append(sequence_number)
sequence_number += 1
else:
index_list.append("") # keep column blank if not 7 chars
else:
data_list.append("")
index_list.append("")
print(f"Length of index_list: {len(index_list)}")
print(f"Length of data_list: {len(data_list)}")
# ---------------------------------------------
# Save to Excel
# ---------------------------------------------
df = pd.DataFrame({
"Index": index_list, # will be column A
"Content": data_list, # will be column B
})
# header=False to start at column A without headers, index=False to omit row numbers
df.to_excel(OUTPUT_XLSX, index=False, header=False)
print(f"Saved: {OUTPUT_XLSX}")