首页 > 解决方案 > Python:获取一个文本文件并生成另一个文本文件并修改某些行的脚本

问题描述

我正在编写一个 python 脚本,它需要一个文本文件,并且应该生成另一个文本文件,其中某些行的更改最少。

我一直被卡住,希望能得到一些帮助。

目的是我可以从命令行运行:

$ ./script_j_to_uj.py eval_c_sensor.j eval_c_sensor.uj

并且 .uj 包含具有指定更改的 .j 文本。到目前为止,我的代码是:

#!/usr/bin/env python
import os, sys

input = open(sys.argv[1])
output = open(sys.argv[2], 'w')
for s in input.xreadlines(  ):
   output.write(s.replace("lib_c_support", "lljvm/lib/lib_c_support"))
   output.write(s.replace(".method public <clinit>()V", ".method static <clinit>()V"))
   output.write(s.replace("invokestatic java/lang/lljvm/lib/c/exit(I)V", ";;;; invokestatic java/lang/lljvm/lib/c/exit(I)V"))
   output.write(s.replace(".method public static main([Ljava/lang/String;)V", ".method public static main()V"))
   output.write(s.replace("invokestatic eval_c_sensor/main()I", "invokestatic eval_c_sensor/main2()I"))
   output.write(s.replace(".method public static main()I", ".method public static main2()I"))
output.close(  )
input.close(  )

但这会产生错误。我相信我的第一个错误是查看文本文件,但我不确定。错误是:

  File "C:/Users/SvenA/OneDrive/Documents/temp/script.py", line 6, in <module>
    for s in input.xreadlines(  ):
AttributeError: '_io.TextIOWrapper' object has no attribute 'xreadlines'

标签: pythonparsing

解决方案


我假设您打算编写类似于以下内容的内容:

    #!/usr/bin/env python
    import os, sys

    with open(sys.argv[1]) as input:
        # Ensure the output file is empty
        with open(sys.argv[2], 'w') as output:
            output.write('')

        # Write all of the lines
        with open(sys.argv[2], 'a') as output:
            for s in input.readlines():
                output.write(s.replace("lib_c_support", "lljvm/lib/lib_c_support"
                     ).replace(".method public <clinit>()V", ".method static <clinit>()V"
                     ).replace("invokestatic java/lang/lljvm/lib/c/exit(I)V", ";;;; invokestatic java/lang/lljvm/lib/c/exit(I)V"
                     ).replace(".method public static main([Ljava/lang/String;)V", ".method public static main()V"
                     ).replace("invokestatic eval_c_sensor/main()I", "invokestatic eval_c_sensor/main2()I"
                     ).replace(".method public static main()I", ".method public static main2()I"))

我的代码还是有点乱,但你似乎遇到了三个问题:

  1. 写 6 次而不是 1 次
  2. 使用 'w'rite 而不是 'a' append 作为模式,并且
  3. 使用xreadlines而不是readlines.

推荐阅读