2015-11-22 35 views
1

我有一个包含我的学校时间表的文件,我想从文件中的每一行创建一个列表。该文件看起来是这样的:使用具有格式化字符串的Python的exec()函数?

first:second:third:fourth:fifth 
first:second:third:fourth:fifth 

的代码是这样的:

schedule_file = "school-schedule.txt" 
with open(schedule_file) as schedule: 
    for c, line in enumerate(schedule): 
     exec("ln%s = schedule.read().split(':')" % str(c+1)) 

print(ln1) 
print(ln2) 
print(ln3) 
print(ln4) 
print(ln5) 
print(ln6) 
print(ln7) 
print(ln8) 
print(ln9) 
print(ln10) 

我知道该文件还有十行,这就是为什么,出于测试目的,我想它来打印这十年名单。不幸的是,它似乎把第一行到名为ln1列表,并提出了一个NameError异常所有其他列表,从ln2

['first', 'second', 'third', 'fourth', 'fifth'] 
Traceback (most recent call last): 
    File "D:\schedule.py", line 10, in <module> 
    print(ln2) 
NameError: name 'ln2' is not defined 

是没可能使用格式化字符串exec()函数内部还是我我犯了一些其他愚蠢的错误?

+3

你错就错在使用'EXEC()'。不惜一切代价避免它。而不是试图动态制作10个变量,只需使用字典。 – MattDMo

回答

1
for c, line in enumerate(schedule): 
    exec("ln%s = schedule.read().split(':')" % str(c+1)) 

从文件中的行是在变量line,但你写道:

exec("ln%s = schedule.read().split(':').... 

代替:

exec("ln%s = line.split(':')... 

在任何情况下,无论何时你发现自己写的变量与名称如下:

print(ln1) 
print(ln2) 
print(ln3) 
print(ln4) 

其中变量名仅一些不同,那么你需要停止你正在做什么,并用一个列表来代替。如果你有一个名为ln列表,然后在列表中的项目已经有名字ln[0], ln[1]等,所以,你可以这样做:

with open('data.txt') as f: 
     ln = [line.rstrip().split(':') for line in f] 

print(ln) 
print(ln[0]) 
print(ln[1]) 

--output:-- 
$ cat data.txt 
a:b:c:d 
e:f:g:h 

$ python prog.py 
[['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h']] 
['a', 'b', 'c', 'd'] 
['e', 'f', 'g', 'h'] 
+0

谢谢你。正如我在第一个答案下所说的,我不确定为什么我需要十个变量。使用列表要容易得多,绝对更优雅。 –

1

您已经阅读一次迭代后的整个文件,所以你从来没有闯过第一exec("ln%s = .....

exec("ln%s = schedule.read().split(':')" % str(c+1)) 
         ^^^ 
        .read() # reads whole/rest of file 

通过索引只需使用readlines方法和访问:

with open(schedule_file) as schedule: 
    data = schedule.readlines() 
ln1 = data[0].split(":") 
..... 

地图相结合,拆分:

data = list(map(lambda x: x.split(":"),schedule)) 

你也可以使用字典,但它不是真正的除了简单地使用列表和通过索引访问之外,它将会有什么好处。

如果你真的想10个变量,然后解压:

with open(schedule_file) as schedule: 
    ln1,ln2 ....ln10 = map(lambda x: x.split(":"),schedule 
+0

谢谢。使用readlines和索引访问比我想象的要容易得多。有很多要学习:) 再次感谢! –

+0

不用担心,第一次为所有的东西:) –