考虑一个名为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')))
为什么?
答案 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())