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

Python文本处理脚本报错求助:xreadlines属性不存在

解决Python3中xreadlines报错及代码逻辑优化问题

首先,你遇到的AttributeError是因为xreadlines()是Python2专属方法,在Python3里已经被移除了——Python3的文件对象本身就是可迭代的,直接遍历即可,不需要调用这个方法。

不过先别急,你的代码还有一个更严重的逻辑问题:当前写法会把同一行内容重复写入6次(每个replace后都执行一次write),这肯定不是你想要的结果。我们一起把这两个问题都解决掉:

修复后的完整代码

#!/usr/bin/env python
import sys

# 使用with语句自动管理文件,无需手动调用close
with open(sys.argv[1], 'r') as input_file, open(sys.argv[2], 'w') as output_file:
    # 直接遍历文件对象(Python3推荐的逐行读取方式)
    for line in input_file:
        # 链式调用replace,逐步修改同一行内容
        modified_line = line.replace("lib_c_support", "lljvm/lib/lib_c_support")
        modified_line = modified_line.replace(".method public <clinit>()V", ".method static <clinit>()V")
        modified_line = modified_line.replace("invokestatic java/lang/lljvm/lib/c/exit(I)V", ";;;; invokestatic java/lang/lljvm/lib/c/exit(I)V")
        modified_line = modified_line.replace(".method public static main([Ljava/lang/String;)V", ".method public static main()V")
        modified_line = modified_line.replace("invokestatic eval_c_sensor/main()I", "invokestatic eval_c_sensor/main2()I")
        modified_line = modified_line.replace(".method public static main()I", ".method public static main2()I")
        # 最后只写入一次修改后的行
        output_file.write(modified_line)

关键修改点说明

  1. 移除xreadlines():Python3中直接for line in input_file就能高效逐行读取,符合现代Python规范。
  2. 使用with语句:它会在代码块结束后自动关闭文件,避免因忘记close()导致的资源泄漏,代码也更简洁。
  3. 修正写入逻辑:先把所有替换操作应用到同一行字符串上,最后只执行一次write,彻底解决重复写入问题。
  4. 变量名优化:把input和output改成input_file、output_file,避免和Python内置的input()函数重名,减少代码混淆。

可选优化:用规则列表简化代码

如果后续需要添加更多替换规则,可以把规则做成列表,循环处理,代码更易维护:

#!/usr/bin/env python
import sys

# 定义替换规则:(原字符串, 目标字符串)
replace_rules = [
    ("lib_c_support", "lljvm/lib/lib_c_support"),
    (".method public <clinit>()V", ".method static <clinit>()V"),
    ("invokestatic java/lang/lljvm/lib/c/exit(I)V", ";;;; invokestatic java/lang/lljvm/lib/c/exit(I)V"),
    (".method public static main([Ljava/lang/String;)V", ".method public static main()V"),
    ("invokestatic eval_c_sensor/main()I", "invokestatic eval_c_sensor/main2()I"),
    (".method public static main()I", ".method public static main2()I"),
]

with open(sys.argv[1], 'r') as input_file, open(sys.argv[2], 'w') as output_file:
    for line in input_file:
        modified_line = line
        for old_str, new_str in replace_rules:
            modified_line = modified_line.replace(old_str, new_str)
        output_file.write(modified_line)

这样你只需要在replace_rules里增删条目,不需要修改循环逻辑,扩展性更好。

最后,你的命令行执行方式是正确的:在类Unix系统(Linux/macOS)下直接运行./script_j_to_uj.py eval_c_sensor.j eval_c_sensor.uj即可;Windows系统需要用python script_j_to_uj.py eval_c_sensor.j eval_c_sensor.uj执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:17:07