You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将CSV转Dokuwiki语法时遇fhost未定义NameError错误求助

修复Python脚本中的NameError: name 'fhost' is not defined错误

嘿,这个错误的原因特别直接——你在调用fhost.write()的时候,fhost这个文件对象还没被正确定义出来。看你的代码片段,fhost = open(...)的部分没写完,而且就算写完了,也要确保在执行写入操作前,这个变量已经完成初始化。

我来给你梳理下修复思路和修改后的完整代码:

问题根源

你的代码里,else块内的fhost = open(...)语句不完整,导致程序走到fhost.write()这一行时,找不到fhost变量,直接抛出了NameError。另外原始代码还有几个潜在问题,比如没处理换行符、没考虑字段数不一致的情况,我一起帮你修正了。

修改后的完整代码

#!/usr/bin/python
# 用with语句打开CSV文件,自动管理资源
with open("/etc/serverliste/server.csv", "r") as f:
    title = []
    line_num = 0
    for line in f:
        # 去掉每行末尾的换行符,再按分号分割字段
        arr = line.strip().split(";")
        if line_num == 0:
            # 第一行作为标题行
            title = arr
        else:
            # 假设CSV第一列是主机名,用来生成Dokuwiki格式的文件名
            # 你可以根据实际需求调整文件名规则
            host_filename = f"/etc/serverliste/{arr[0]}.dokuwiki"
            # 再次用with语句打开目标文件,自动处理关闭操作
            with open(host_filename, "w") as fhost:
                # 遍历标题和对应的数据字段
                for idx in range(len(title)):
                    # 防止数据行字段数少于标题行导致索引越界
                    if idx < len(arr):
                        fhost.write(f"{title[idx]}: {arr[idx]}\n")
        line_num += 1

关键修复点

  • 补全fhost的定义:明确指定要写入的文件名和打开模式(w表示覆盖写入,若需追加内容可改用a),用with语句处理文件,无需手动关闭,更安全可靠。
  • 处理换行符:用strip()去掉每行末尾的\n,避免写入的内容出现多余空行。
  • 索引越界防护:增加if idx < len(arr)判断,避免当CSV数据行的字段数比标题行少时,抛出索引错误。
  • 优化变量可读性:把i改成line_num,代码逻辑更清晰。

额外注意事项

  • 确保你的Python脚本有写入/etc/serverliste/目录的权限,否则会抛出PermissionError。
  • 确认你的CSV文件确实用**分号;**作为分隔符,如果是逗号或其他符号,要修改split(";")里的参数。
  • 如果需要生成符合Dokuwiki语法的格式(比如条目列表),可以调整fhost.write()的内容,比如改成fhost.write(f"* {title[idx]}: {arr[idx]}\n")生成列表项。

内容的提问来源于stack exchange,提问作者AlexanderB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:33:45