1

lst.txt という名前のファイルについて考えて('a', ('b',('c','d')))みましょう。その内容は次のとおりです。

コード:

if __name__ == '__main__':
  with open('lst.txt') as fx:
    strs = fx.readline()
    print tuple(strs)

結果は次のとおりです。['(', "'", 'a', "'", ',', '(', "'", 'b', "'", ',', '(', "'", 'c', "'", ',', "'", 'd', "'", ')', ')', ')', '\n']

しかし、Python シェルを使用すると、結果が異なります。

>>>test_str = ('a', ('b',('c','d')))
>>>result = tuple(test_str)
>>>print result
('a', ('b', ('c', 'd')))

なぜ?

4

3 に答える 3

1

この2つは同等ではないため、ファイルから読み取るときに、テキストはpythonとして解析されません。同等のことは次のとおりです。

>>>test_str = "('a', ('b',('c','d')))"
>>>result = tuple(test_str)

それはあなたがあなたの結果を得る理由をかなり明確にするはずです。文字列は繰り返されてタプルに変換され、各文字はタプル内のアイテムに変換されます。

これが与えられた場合、あなたがする必要があるのはファイル内のデータを解析することです。これは明らかに悪い方法で行うことができますが、安全な方法の1つはを使用することast.literal_eval()です。

最善の策は、データをJSONなどの別の形式で保存してからjsonモジュールを使用してファイルからデータを取得することです。人間が読める形式である必要がなく、データの出所を把握して信頼できる場合はpickle、使いやすさのためにuseを使用できます。

于 2012-04-25T10:08:40.307 に答える
0

testStrすでにタプルです。を試してみるtest_str = "('a', ('b',('c','d')))"と、ファイルと同じ結果が得られます。

于 2012-04-25T10:09:15.990 に答える
-3
('a', ('b',('c','d')))

これはstrではなく、すでにタプルです

>>> type(('a', ('b',('c','d'))))
<type 'tuple'>

これを試して

with open('lst.txt') as f:
  print eval(f.read())
于 2012-04-25T10:09:56.770 に答える