将 Python 的 exec() 函数与格式化字符串一起使用?
Using Python's exec() function with formatted string?
我有一个包含我的学校时间表的文件,我想根据文件中的每一行创建一个列表。该文件看起来像这样:
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()
函数中使用格式化字符串,还是我犯了其他一些愚蠢的错误?
您在第一次迭代后阅读了整个文件,因此您永远不会超过第一个 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))
您也可以使用 dict,但它实际上不会比简单地使用列表并按索引访问有任何好处。
如果你真的想要十个变量然后解压:
with open(schedule_file) as schedule:
ln1,ln2 ....ln10 = map(lambda x: x.split(":"),schedule
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']
我有一个包含我的学校时间表的文件,我想根据文件中的每一行创建一个列表。该文件看起来像这样:
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()
函数中使用格式化字符串,还是我犯了其他一些愚蠢的错误?
您在第一次迭代后阅读了整个文件,因此您永远不会超过第一个 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))
您也可以使用 dict,但它实际上不会比简单地使用列表并按索引访问有任何好处。
如果你真的想要十个变量然后解压:
with open(schedule_file) as schedule:
ln1,ln2 ....ln10 = map(lambda x: x.split(":"),schedule
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']