2017-03-09 6 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) 

広告の繰り返しを繰り返します。すべてのデータを処理するには84回の反復が必要ですが、当然のことながら、それぞれのファイル名とフェーズに一致するように少しずつ調整する必要があります。

最後に、私のコードの最後に、後で操作するために各テーブルをascii.writeするコードをいくつかの.datファイルに設定しました。

この全体の方法は、セットアップが非常に疲れています。それがデータを扱う唯一の方法なら、私はそれをやるでしょう。しかし、私はそれを設定するためのより速い方法を見つけることができると思っています。あなたが提案できるものはありますか?

+0

ああ、ありがとう私の質問にdownvote。今私は助けを受けるだろうと確信しています。 – Izzy

+1

将来、このような下落を避けるには、試したコードを共有して、それが機能しない理由を説明してください。そうでなければ、あなたが何もしていないのと同様に、私たちがあなたのためにコードを書くことを望むように、助けて、何よりも上手く聞こえません。あなたのコードを共有してください。私はDVを削除して助けてくれるでしょう。あなたのコードを見たら、100倍近い複製を避ける方法を教えてください。 – Julien

+0

あなたの返事にうっすらの返事を申し訳ありません。たぶん私はコードについてコーダーとのコミュニケーションに慣れていないかもしれません。私は物理学の学生ですが、私は過去10年間に1つのクラスだけをコーディングしました...これはもっと明確ですか? – Izzy

答えて

1

copyの代わりに効率とコードの再利用を目標とするなら、Classesが良い方法を提供すると思います。私は今寝るつもりですが、後で編集します。ここで私の考えです: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

@Ajay Brahmakshatriyaにより示唆されるようexecを使用しての安全性の問題を回避するために、彼の最初の処理ステップを保ち、あなたは、何か独自の最小限の「相パーサ」を作成することができます

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ステートメントをスキップして安全性を損なうことはありません。

関連する問題