2014-10-27 45 views
0

我已经制作了列表来存储给定学生的分数数据。该名单被称为“class1”,每名学生都有一个名字,然后是3分。我可以对这个文件列表罚款,可以写信给其显示出正确格式的数据文件:将列表清单读入Python

class1=[["Tom",7,2,1],["Jo",8,0,0],["Adelphe",9,0,0]] 

当写这个样子的,我很高兴有:

['Tom', 7, 2, 1] 
['Jo', 8, 0, 0] 
['Adelphe', 9, 0, 0] 

问题是当我尝试读取相同的列表。每个子列表都以字符串形式读取。我似乎无法改变这一点。

下面是代码:

class1 = [line.strip() for line in open("data2.txt", 'r')] 

这是列表的外观,当念想,你可以看到有大约每个子列表撇号,这意味着他们Class1的列表中的字符串:

["['Tom', 7, 2, 1]", "['Jo', 8, 0, 0]", "['Adelphe', 9, 0, 0]"] 

任何人都可以帮助我,我做了很多搜索,但找不到任何人有同样的问题。

谢谢,汤姆

+0

你的意思是'split',不'strip'。 – jonrsharpe 2014-10-27 11:32:25

+3

为什么不使用JSON或CSV而不是发明自己的格式? – geoffspear 2014-10-27 11:33:15

+0

尝试使用'eval(string)'。如果字符串表示一个列表,它应该成为一个python列表对象。即'class1 = [eval(line.strip())for line in open(“data2.txt”,'r')]' – SomethingSomething 2014-10-27 11:33:21

回答

1
>>> import ast 
>>> with open('/path/to/data2.txt', 'r') as classes: 
     lines = [ast.literal_eval(line.strip()) for line in classes] 

>>> print lines 
[['Tom', 7, 2, 1], ['Jo', 8, 0, 0], ['Adelphe', 9, 0, 0]] 
+0

嗨,eval工作。使用什么好处:ast.literal_eval?请原谅我的无知! – 2014-10-27 11:55:57

+0

@TomSmith'ast.literal_eval'可防止任意代码执行。 – 2014-10-27 12:03:30

+0

@TomSmith'''eval'''会评估**任何**有效的表达式,这使得未知的数据可能会损害您的计算机,例如创建一个巨大的字符串并耗尽您的处理器时间和/或内存。除非你100%确信你的数据不要使用''''eval''',''ast.literal_eval''是安全的,因为它限制了表达式的类型。 – wwii 2014-10-27 12:05:53