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 shell,结果会有所不同:

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

为什么?

4

3 回答 3

1

因为两者不等价,所以当您从文件中读取时,您的文本不会被解析为 python。等效的是:

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

这应该很清楚为什么你会得到你的结果。字符串被迭代并变成一个元组,每个字符都被变成元组中的一个项目。

鉴于此,您需要做的是解析文件中的数据。您可以通过一些明显不好的方式来做到这一点,但一种安全的方法是使用ast.literal_eval().

最好的办法是以另一种格式存储数据,例如 JSON,然后使用模块从文件中获取数据json如果您不需要它是人类可读的,并且知道您的数据来自哪里并信任它,那么您可以使用 usepickle以方便使用。

于 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 回答