2016-12-03 8 views
0

これは、Pythonで行うのが最も基本的なことであるように思えます。ファイルからPythonデータ型を読み取る方法

123, [12, 23, 45, 67] 

のような行を持つテキストファイルがあります。2番目の配列の長さは可変です。これをどのように読むのですか?どのような理由であれ、私は '['または ']'を扱う方法に関するドキュメンテーションを見つけることができません。これは、Pythonの最も基本的な文字です。

np.loadtxtは明らかに、これは

np.genfromtxtが原因不足している列に、バストただけのファイル形式の最も簡単なためで、バストでした。ところで、missing_value機能がここで役に立つと思っています。 missing_valueが実際に何をしているのかを知ることは有益でしょう(それはドキュメントにはっきりと説明されていません)。

私はおそらく、私は「[」と「]」に対処するための項目でこのアイテムを解析することができますが、この段階で、私はちょうど自分自身をした私に

['123', '[12', '23', '45', '67]'] 

を与えるnp.fromstringルートを試してみましたPythonファイルリーダーを使ってかなり基本的なPythonの構文を読むことができます!

希望の出力については、この段階ではほとんど何でも解決します。明白な構築物は、簡単なsplitで始まる行を解析フォーム

[123, [12, 23, 45, 67]] 
+2

は*「私は1つのpythonで単一の最も基本的な文字で主張するかもしれない 『[』または 『]』に対処する方法についてのドキュメントの一枚を見つけることができません。」*それは理由が考えられますその形式でテキストファイルに含めることは珍しいことです。より一般的なのはプレーンなCSV(カンマ区切りの値、角括弧なし)です。もう1つの極端な例は、さまざまなデータ型のさまざまな区切り文字で、[JSON](http://www.json.org/)とその親類です。ファイル形式の設計を管理している場合は、単純なCSV(角括弧なし)にするか、完全なJSONにすることをお勧めします。 –

答えて

2

loadtxtgenfromtxtの行ずつになります。

In [360]: '123, [12, 23, 45, 67]'.split(',') 
Out[360]: ['123', ' [12', ' 23', ' 45', ' 67]'] 

次に、個々の文字列を変換しようとします。 intやfloatに簡単に変換するものもあります。 []のものはありません。それらを扱うことは自明ではありません。

Pythonに付属のcsvリーダーは、引用符で囲まれたテキストを扱うことができます。

`one, "twenty, three", four' 

私は十分にそれが引用符として[]を扱うことができるかどうかを知るためにそれをプレイしていません。

あなたの括弧書きの文章は、あなたが括弧の中に異なる区切り文字を使用した場合の解析が容易になり、例えば

In [371]: l1='123; [12, 23, 45, 67]'.split(';') 
In [372]: l1 
Out[372]: ['123', ' [12, 23, 45, 67]'] 
In [373]: l2=l1[1].strip().strip(']').strip('[').split(',') 
In [374]: l2 
Out[374]: ['12', ' 23', ' 45', ' 67'] 

ウォーレンがコメントしたよう、無地のCSVは、業界標準のようなもので、多くの言語で使用されます。角かっこなどの使用は標準化されていません。しかし、XML、JSON、yamlなどのデータ交換言語や、テキスト以外のデータファイル(例:HD5F)があります。

JSON例:

In [377]: json.loads('[123, [12, 23, 45, 67]]') 
Out[377]: [123, [12, 23, 45, 67]] 
1

デフォルトのオプションがevalです。 Pythonの式を文字列で評価することができます。セキュリティ上の危険があります。 this question。しかし、ast.literal_evalは大丈夫です。たとえば:

from ast import literal_eval 

with open("name of file") as fh: 
    data = [literal_eval(line) for line in fh] 
関連する問題