Initial commit
This commit is contained in:
109
data/server_list/excel.py
Normal file
109
data/server_list/excel.py
Normal file
@@ -0,0 +1,109 @@
|
||||
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}")
|
||||
Reference in New Issue
Block a user