【问题标题】:Using Python's basic I/O to manipulate or create Python Files?使用 Python 的基本 I/O 来操作或创建 Python 文件?
【发布时间】:2012-07-06 05:20:04
【问题描述】:

最有效的方法——我知道它不是很有效,但老实说我找不到更好的方法——操作 Python (.py) 文件,添加/减去/追加代码,是使用Python中包含的基本文件I/O模块?

举个例子:

obj = open('Codemanipulationtest.py', 'w+')
obj.write("print 'This shows you can do basic I/O?'")
obj.close()

将操作我拥有的一个名为“codemanipulationtest.py”的文件,并向其中添加一条打印语句。这是可以解决的问题,还是有任何更简单或更安全/有效的方法来操作/创建新的 python 代码?

我读过这个:Parse a .py file, read the AST, modify it, then write back the modified source code

老实说,I/O 方法似乎更容易。我对 Python 有点陌生,所以我可能只是表现得很愚蠢......在此先感谢您的任何回复。

编辑

这一切的重点只是玩弄代码的效果。我正在考虑将我最终使用的任何东西连接到某种学习算法,看看它一次生成少量代码的效果如何,看看它可以从那里去哪里......

【问题讨论】:

  • 这完全取决于你想做什么。告诉我们你想用它做什么。任何一种方法都可能适用于给定的任务。
  • 你想做什么?你想写能写程序的程序,朝着什么目的?
  • 请注意,'w+' 会截断现有文件。您可能想要使用'a'(即附加)模式。
  • 是的,我注意到 w+ 在不久之后将其截断。谢谢

标签: python code-generation


【解决方案1】:

为了生成代码,我会将其分解为各种类、IF 类、FOR 类等。然后您可以使用输出,其中每个类都有一个 to_str() 方法,您可以依次调用该方法。

statements = [ ... ]

obj = open( "some.py", "w+" )

for s in statements:
    obj.write( s.to_str() )

obj.close()

通过这种方式,您可以轻松扩展您的项目,并且更易于理解和灵活。而且,它与使用您想要的简单写入方法保持一致。

根据学习算法,这种对各种类别的突破可以很好地引导到一种用于代码的伪遗传算法。您可以将基因组编码为一系列语句,然后您只需要找到一种方法将参数传递给每个语句(如果需要的话)。

【讨论】:

  • 所以我假设 没有 库已经用于此,然后呢?
  • 对于您想要做的事情,我认为没有特定的库。因此,您必须自己编写代码生成部分。机器学习部分有 PyBrain,您可以查看它可能会阻止您编写学习部分。
【解决方案2】:

这取决于您将如何处理生成的代码。您有几个选项,每一个都比上一个更高级。

  • 创建文件并导入
  • 创建一个字符串并exec
  • 编写代码以直接创建类(或模块)而不是文本,将您需要的任何功能插入其中
  • 直接生成 Python 字节码并执行!

如果您正在编写将被其他程序员使用和修改的代码,那么第一种方法可能是最好的。否则,对于大多数用例,我建议使用第三种。最后一个只适用于受虐狂和前汇编语言程序员。

如果您想修改现有的 Python 源代码,有时可以通过基本的搜索和替换进行简单的修改,特别是如果您对正在使用的源文件有所了解,但更好的方法是ast 模块。这为您提供了 Python 源代码的抽象表示,您可以对其进行修改,然后直接编译成 Python 对象。

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 2016-03-06
    • 1970-01-01
    • 2015-07-20
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多