2017-01-26 10 views
1

私はファイル "test.txt"を持っています。そのデータは次のスタイルになっています:python3を使用して、スタイルがリストとタプルであるtxtファイルから情報を取得します

この例では、ファイルの最初の行のみが表示され、実際には20行あります。

各行では、「[」で始まり「]」で終わります(「\ n」は単なる改行記号です)。 ご覧のとおり、各行のパターンは「[((()))、((()))、...]」です。実際には、1つの[]内に10000((())))があります。

python3を使用してこの情報を読み取る方法をご存知ですか?私が欲しい

結果は

x_row1 = [[5.0, 1.12, 1], 
      [4.21, 3.2, 2], 
      ..., 
     ] # len(x_row1) == 10000 
y_row1 = [[False, []], 0.85], 
      [True, []], 0.7997], 
      ..., 
     ] # len(y_row1) == 10000 

x_row_all = [[x_row1], [x_row2], ..., [x_row20]] 
y_row_all = [[y_row1], [y_row2], ..., [y_row20]] 

おかげです。

答えて

1

使用ast.literal_eval

は安全式ノードやPython リテラルまたはコンテナ表示を含む文字列を評価します。 の文字列またはノードは、文字列、バイト、 の数値、タプル、リスト、ディクテーション、セット、ブール値、およびNoneというPythonのリテラル構造で構成されています( のみ)。あなたの特定の問題については

>>> import ast 
>>> ast.literal_eval('[(5.0, 1.12, 1, ((False, []), 0.85)), (4.21, 3.2, 2, ((True, []), 0.7997))]\n') 
[(5.0, 1.12, 1, ((False, []), 0.85)), (4.21, 3.2, 2, ((True, []), 0.7997))] 

import ast 

with open('test.txt', 'r') as f: 
    all_rows = list(map(ast.literal_eval, f)) 

x_row_all = [[item[:3] for item in row] for row in all_rows] 
y_row_all = [[item[-1] for item in row] for row in all_rows] 

あなたは本当にタプルがリストになるために必要がある場合は代わりん:

def detuple(tup): 
    return [detuple(x) if isinstance(x, tuple) else x for x in tup] 

x_row_all = [[list(item[:3]) for item in row] for row in all_rows] 
# tup = ((False, []), 0.85); detuple(tup) => [[False, []], 0.85] 
y_row_all = [[detuple(item[-1]) for item in row] for row in all_rows] 

代わりに、あなたは最初からリストを持つことができる場合を次のように作成します。

all_rows = [ast.literal_eval(line.replace('(', '[').replace(')', ']') for line in f] 
+0

これは私の質問を完全に解決します。ありがとう! – aura

関連する問題