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)
关键修改点说明
- 移除
xreadlines():Python3中直接for line in input_file就能高效逐行读取,符合现代Python规范。 - 使用
with语句:它会在代码块结束后自动关闭文件,避免因忘记close()导致的资源泄漏,代码也更简洁。 - 修正写入逻辑:先把所有替换操作应用到同一行字符串上,最后只执行一次
write,彻底解决重复写入问题。 - 变量名优化:把
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
相关产品推荐
相关产品推荐

