python无法将从文件读取的行转换为列表或元组

时间:2012-04-25 10:02:42

标签: python

考虑一个名为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')))

为什么?

3 个答案:

答案 0 :(得分:1)

因为这两者不相同,所以当你从文件中读取时,你的文本不会被解析为python。相当于:

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

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

这个给出,您需要做的是解析文件中的数据。您可以使用一些明显的错误方式执行此操作,但一种安全方法是使用ast.literal_eval()

最好的办法是将数据存储为其他格式,如JSON,然后使用the json module从文件中获取数据。如果您不需要它是人类可读的,并且知道您的数据来自何处并信任它,您可以使用pickle来使用。

答案 1 :(得分:0)

testStr已经是一个元组。试试test_str = "('a', ('b',('c','d')))",您将获得与文件相同的结果。

答案 2 :(得分:-3)

('a', ('b',('c','d')))

这不是一个str,它已经是一个元组

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

试试这个

with open('lst.txt') as f:
  print eval(f.read())