1

テキストファイル内のアイテムを解析してリストに保存しようとしています。データは次のようになります。

[(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (4, 0, 0), (5, 0, 0), (6, 0, 0)]
[(10, 3, 1), (11, 3, 1), (12, 3, 1), (13, 3, 1), (13, 4, 1)]
[(10, 3, 5), (11, 3, 5), (12, 3, 5), (13, 3, 5), (13, 4, 5), (13, 5, 5), (13, 6, 5)]
[(6, 13, 5), (7, 13, 5), (8, 13, 5), (8, 14, 5), (7, 14, 5), (6, 14, 5), (6, 14, 6)]

「[」と「]」を削除することはできましたが、残りの情報を(x、y、z)の形式でリストに保存することはできませんでした。何か助けはありますか?

 def dataParser(fileName):
    zoneList=[]; zone=[]
    input=open(fileName,"r")

    for line in input:
        vals = line.strip("[")
        newVals = vals.strip("]\n")

        print newVals
        v=newVals[0:9]
        zone.append(v)

    input.close()
    return zone
4

5 に答える 5

6

この特定のケースでは、次を使用できますast.literal_eval

>>> with open("list.txt") as fp:
...     data = [ast.literal_eval(line) for line in fp if line.strip()]
... 
>>> data
[[(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (4, 0, 0), (5, 0, 0), (6, 0, 0)], [(10, 3, 1), (11, 3, 1), (12, 3, 1), (13, 3, 1), (13, 4, 1)], [(10, 3, 5), (11, 3, 5), (12, 3, 5), (13, 3, 5), (13, 4, 5), (13, 5, 5), (13, 6, 5)], [(6, 13, 5), (7, 13, 5), (8, 13, 5), (8, 14, 5), (7, 14, 5), (6, 14, 5), (6, 14, 6)]]

の「安全な」バージョンですeval。ただし、正確にその理由から、それほど一般的ではありません。この入力を生成している場合は、データを保存する別の方法 (「シリアライゼーション」) を検討することをお勧めします。使用するかどうかpickleに関係なくJSON、SO と他の場所で見つけることができる両方を使用する例がたくさんあります。

于 2012-09-06T21:14:23.710 に答える
3

文字列分割メソッドとタプル コンストラクターを使用して、eval なしで実行できます。

>>> st = "[(0,0,0), (1,0,0)]"
>>> splits = st.strip('[').strip(']\n').split(', ')
>>> splits
['(0,0,0)', '(1,0,0)']
>>> for split in splits:
...   trimmed = split.strip('(').strip(')')
...   tup = tuple(trimmed.split(','))
...   print tup, type(tup)
...
('0', '0', '0') <type 'tuple'>
('1', '0', '0') <type 'tuple'>
>>>

そこから、リストに追加するだけです。

于 2012-09-06T21:34:20.713 に答える
2

ここでの使用を好まない人もいるかもしれませんがeval()、これを使用して1行でこれを行うことができます:

In [20]: lis=eval("[(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (4, 0, 0), (5, 0, 0), (6, 0, 0)]")
In [23]: lis
Out[23]: [(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (4, 0, 0), (5, 0, 0), (6, 0, 0)]

テキストファイルを使用する:

In [44]: with open('data.txt') as f:
   ....:     lis=[eval(x.strip()) for x in f]
   ....:     print lis
   ....:     
   ....:     
[[(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (4, 0, 0), (5, 0, 0), (6, 0, 0)], [(10, 3, 1), (11, 3, 1), (12, 3, 1), (13, 3, 1), (13, 4, 1)], [(10, 3, 5), (11, 3, 5), (12, 3, 5), (13, 3, 5), (13, 4, 5), (13, 5, 5), (13, 6, 5)], [(6, 13, 5), (7, 13, 5), (8, 13, 5), (8, 14, 5), (7, 14, 5), (6, 14, 5), (6, 14, 6)]]
于 2012-09-06T21:13:52.937 に答える
0

完全に信頼できないソースからこのデータを取得している場合、次の方法はお勧めできませんが、データが常にこの形式である場合 (要素として数字のみが含まれる場合) は、次のようなものは非常に簡単です。

collect = []
for line in input:
    collect.append(eval(line))
于 2012-09-06T21:14:24.243 に答える
0

他の答えは問題なく機能し、この特定の問題に対する簡単な解決策です。しかし、文字列操作に問題がある場合、単純な eval() 関数は、次にこの問題が発生したときにあまり役に立たないと思います。

原則として、このような問題に直面したときに最初に行うことは、区切り文字を定義することです。

[(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (4, 0, 0), (5, 0, 0), (6, 0, 0)]

ここで、"), ("がグループ間の潜在的な区切り記号であり、単純なコンマ ( "," ) が値間の区切り記号であることがわかります。次に、削除する必要があるものと、ご指摘のとおり、括弧 ( "[""]" ) はほとんど情報を提供しません.また、数値を扱っているため、すべてのスペースはほとんど情報を提供せず、削除する必要があることもわかります.

この情報に基づいて、探していた値を返すようにdataParser関数を設定しました。

fileName= "../ZoneFinding/outputData/zoneFinding_tofu_rs1000.txt"

def dataParser(fileName):
    with open(fileName,"r") as input
        zoneLst = []
        for line in input:
            #First remove white space and the bracket+parenthese combos on the end
            line = line.replace(" ","").replace("[(","").replace(")]","")

            #Now lets split line by "),(" to create a list of strings with the values
            lineLst = line.split("),(")

            # At this point lineLst = ["0,0,0" , "1,0,0", "2,0,0", ...]
            #Lastly, we will split each number by a "," and add each to a list
            zone = [group.split(",") for group in lineLst]

            zoneLst.append(zone)

        return zoneLst

上記の例では、すべての値が文字列として格納されています。ゾーンの定義を以下のコードに置き換えて、値を float として格納することもできます。

zone = [ [float(val) for val in group.split(",")] for group in lineLst]
于 2012-09-06T22:23:03.253 に答える