import csv from typing import List def load_rows(csv_path: str) -> List[List[str]]: """ 加载 CSV 并返回行列表 参数: csv_path: CSV 文件路径 返回值: 包含表头与数据的二维列表 """ with open(csv_path, "r", encoding="utf-8") as f: reader = csv.reader(f) return [row for row in reader] def save_rows(csv_path: str, rows: List[List[str]]) -> None: """ 保存 CSV 行列表到指定路径 参数: csv_path: 目标 CSV 文件路径 rows: 二维列表,包含表头与数据 """ with open(csv_path, "w", encoding="utf-8", newline="") as f: writer = csv.writer(f) writer.writerows(rows) def tutorial_for(chain_name: str, mining_method: str) -> str: """ 根据挖矿方式生成简洁的部署教程 参数: chain_name: 公链名称 mining_method: 挖矿方式描述 返回值: 教程简述(单行,分号分隔步骤) """ mm = (mining_method or "").lower() if "sha-256" in mm: return ( "准备ASIC矿机(比特币/BCH/BSV); 选择矿池(如ViaBTC/AntPool); 在矿池创建账户与子账户; " "矿机接网与供电, 在Web面板设置矿池地址与Worker(钱包地址.矿机名); 监控算力与温度; 收益自动结算至钱包" ) if "scrypt" in mm: return ( "准备Scrypt ASIC(挖LTC/DOGE合并挖矿); 选择矿池(F2Pool/AntPool); 配置矿池URL、钱包地址与Worker; " "优化散热与功耗; 查看合并挖收益在矿池面板" ) if "kheavyhash" in mm: return ( "安装GPU矿软(BzMiner/Gminer); 选矿池(KaspaPool/Herominers); 示例: bzminer -a kheavyhash -o stratum+tcp://pool:port -u 钱包地址; " "确保显卡驱动与超频稳定; 收益打到Kaspa钱包" ) if "randomx" in mm: return ( "CPU挖矿安装xmrig; 选矿池(支持XMR的池); 生成Monero钱包地址; 运行: xmrig -o pool:port -u 钱包地址 -k; " "调优HugePages与内存频率以提升性能" ) if "equihash" in mm: return ( "安装miniZ/GMiner等Equihash矿软; 选矿池(ZEC/ZEN池); 运行示例: miner -a equihash -o stratum+tcp://pool:port -u 钱包地址; " "调整显存时序/功耗曲线以稳定收益" ) if "kawpow" in mm: return ( "安装T-Rex/NBMiner; 选Ravencoin矿池; 命令示例: t-rex -a kawpow -o stratum+tcp://pool:port -u 钱包地址 -p x; " "确保电源足够并优化显卡风扇曲线" ) if "autolykos" in mm: return ( "安装lolMiner/BzMiner; 选Ergo矿池; 示例: lolMiner --algo AUTOLYKOS2 --pool pool:port --user 钱包地址; " "使用高显存效率显卡并优化核心频率" ) if "blake2s" in mm: return ( "准备Kadena ASIC; 选择KDA矿池(如PoolFlare); 在矿机面板配置矿池地址与钱包; " "监控算力与设备温度; 收益结算至Kadena地址" ) if "blake2b" in mm: return ( "CKB可用ASIC或GPU矿软(NBMiner适配Blake2b); 选矿池(如F2Pool); 命令示例: nbminer -a blake2b -o stratum+tcp://pool:port -u 钱包地址; " "保持稳定网络与散热, 收益至钱包" ) if "存储" in mm or "plot" in mm or "硬盘" in mm: if "chia" in chain_name.lower(): return ( "安装Chia客户端; 创建钱包与农场; 使用Plotter(BladeBit/MadMax)生成Plot文件; 挂载Plot目录并启动farmer; " "加入矿池以稳定收益; 定期维护硬盘健康" ) if "filecoin" in chain_name.lower(): return ( "参考官方文档部署lotus/boost; 配置存储矿工(硬件: 大容量HDD/带宽/计算); 完成密封与证明流程; " "对接交易市场提供存储服务; 收益结算至FIL钱包" ) return ( "部署存储型节点; 按官方文档准备大容量硬盘与稳定带宽; 运行矿工进程并完成证明流程; 加入矿池或市场以获取稳定收益" ) if "gpu" in mm or "asic" in mm or "cpu" in mm: return ( "选择对应矿软/设备; 在矿池创建账户; 配置矿池地址与钱包/Worker; 保持稳定供电与散热; 监控算力与收益" ) # 默认情况 return "不适用" def add_tutorial_column(csv_path: str) -> None: """ 读取 CSV, 在末尾新增列“挖矿部署教程”,并对可挖链填充部署步骤 参数: csv_path: CSV 文件路径 """ rows = load_rows(csv_path) if not rows: return header = rows[0] if "挖矿部署教程" not in header: header.append("挖矿部署教程") for i in range(1, len(rows)): row = rows[i] # 兼容行长度不足的情况 while len(row) < len(header): row.append("") chain_name = row[1] if len(row) > 1 else "" mine_flag = row[5] if len(row) > 5 else "否" method = row[6] if len(row) > 6 else "" row[-1] = tutorial_for(chain_name, method) if mine_flag == "是" else "不适用" save_rows(csv_path, rows) def main() -> None: """ 执行列新增与填充 """ csv_path = "chain/top_100_chains.csv" add_tutorial_column(csv_path) if __name__ == "__main__": main()