2017-03-09 52 views
1

我想从协作者向我发送的一组文件中提取一些信息。每个文件都包含一些命名一系列列表的python代码。他们看起来像这样:从非常规文本文件中提取信息? (Python)

#PHASE = 0 
x = np.array(1,2,...) 
y = np.array(3,4,...) 
z = np.array(5,6,...) 

#PHASE = 30 
x = np.array(1,4,...) 
y = np.array(2,5,...) 
z = np.array(3,6,...) 

#PHASE = 40 
... 

等等。共有12个文件,每个文件有7个阶段。我的目标是将每个阶段转换为它自己的文件,然后可以通过ascii.read()作为Table对象读取,以便在不同的代码段进行操作。

我目前的方法效率极低,无论是在资源和组装所需的时间/能源方面。它是这样的:首先得有个功能

def makeTable(a,b,c): 
    output = Table() 
    output['x'] = a 
    output['y'] = b 
    output['z'] = c 
    return output 

然后对于每个阶段,我已经手动复制粘贴的文本文件中的相关部分进入细胞并且附了一行代码

fileName_phase = makeTable(a,b,c) 

重复ad nauseam。这将需要84次迭代来处理所有数据,并且自然每个都需要一些小的调整来匹配特定的文件名和阶段。

最后,在我的代码结束时,我将几行代码设置为将每个表格ascii.write到.dat文件中供以后操作。

这整个方法是非常穷尽的设置。如果它是处理数据的唯一方法,我会做。不过,我希望能找到更快捷的方式来设置它。有没有你可以建议的?

+0

那么这是有帮助的...哦,谢谢你的downvote在我的问题上。我很确定我现在会得到一些帮助。 – Izzy

+1

为了避免将来出现这种低估,请确保您分享您尝试过的代码,并解释为什么它不起作用。否则,它很难提供帮助,尤其是您没有做任何事情,只希望我们为您编写代码。请分享您的代码,我将删除DV并尝试提供帮助,我确信一旦我们看到您的代码,我们就可以告诉您如何对其进行修改,以避免近100次重复。 – Julien

+0

对不起,您的回复响应很快。也许我只是不习惯与编码人员沟通代码。我是一名物理系学生,在过去的10年里我只参加了一门关于编码的课程......这是否更清楚? – Izzy

回答

1

如果效率和代码复用代替复制是目标,我认为类可能提供一个好方法。我现在要睡觉,但我稍后再编辑。这是我的想法:创建一个名为FileWithArrays的类,并使用解析器读取这些行,并将它们放入您将使用该类创建的对象FileWithArrays中。一旦完成,您可以创建一个方法来转换表中的对象。

P.S.解析器的一个好主意是将所有行存储在列表中并逐个解析它们,使用list.pop()来自动缩小列表。希望它有帮助,明天我会更多地关注它,如果这没有多大帮助。如果我误解了任何内容,请尝试重写/重新格式化该问题,这不是很容易阅读。

+0

我在Python编码(表面的,非专业)类没有包含很多类的讨论。你能指点我一个很好的资源,所以我可以教自己吗? – Izzy

+0

也许这将有助于:http://stackoverflow.com/questions/3724110/practical-example-of-polymorphism ...如果我理解这个答案中的想法,他建议为每个稍有不同的情况创建一个子类;那么子类包含特殊情况,并且超类处理一般流和解析。 – tripleee

1

我会建议一种方式,将被许多人嘲笑,但会完成你的工作。

所以对每一个道歉。

此方法的先决条件是您绝对相信输入文件的正确性。我猜你是这么做的。 (毕竟他是你的合作者)。

所以这里的关键是文件中的文本是代码,这意味着它可以被执行。

所以,你可以做这样的事情

import re 
import numpy as np # this is for the actual code in the files. You might have to install numpy library for this to work. 
file = open("xyz.txt") 
content = file.read() 

现在你把所有的内容,你必须通过相位以便将它分离。 为此,我们将使用re.split函数。

phase_data = re.split("#PHASE = .*\n", content) 

现在我们有一个数组中的每个阶段的内容。

现在来执行它的一部分。

for phase in phase_data: 
    if len(phase.strip()) == 0: 
     continue 
    exec(phase) 
    table = makeTable(x, y, z) # the x, y and z are defined by the exec. 
    # do whatever you want with the table. 

我会重申,您必须绝对信任文件的内容。由于您正在将其作为代码执行。

但是你的工作看起来像是一个脚本,我相信这会使你的工作完成。

PS:exec的另一个“更安全”的替代方案是拥有一个沙盒库,它接受字符串并执行它,而不影响父作用域。

1

为了避免使用exec通过@Ajay Brahmakshatriya的建议,但保持他的第一道工序中的安全问题,您可以创建自己的最小“相解析器”,是这样的:

VARS = 'xyz' 
def makeTable(phase): 
    assert len(phase) >= 3 
    output = Table() 
    for i in range(3): 
     line = [s.strip() for s in phase[i].split('=')] 
     assert len(line) == 2 
     var, arr = line 
     assert var == VARS[i] 
     assert arr[:10]=='np.array([' and arr[-2:]=='])' 
     output[var] = np.fromstring(arr[10:-2], sep=',') 
    return output 

,然后调用而不是

table = makeTable(phase) 

exec(phase) 
table = makeTable(x, y, z) 

你也可以跳过所有这些assert声明,而不会影响安全性,如果文件已损坏或未按预期格式化,则将抛出的错误可能只是难以理解......