在使用字典值尝试创建字符串时,我遇到了一个奇怪的问题。基本上,我有一个函数可以打开文件,读取一行,并将它在该行中找到的值存储在字典中。然后,它将这些值发送到外部程序。这是代码:
def createLandscapes(file):
landscapeParameters = {'FILE': "NULL",
'N': "NULL",
'K': "NULL",
'NUM': "100"}
for line in file:
if line == "END LANDSCAPES\n":
break
else:
parameters = line.replace(" ", '').split(",")
for parameter in parameters:
parameter = parameter.split("=")
if parameter[0] not in landscapeParameters:
malformedFile()
landscapeParameters[parameter[0]] = parameter[1]
for key in landscapeParameters:
if landscapeParameters[key] == "NULL":
malformedFile()
# This print statment is for diagnostic purposes
print("./generateScoreTables {} {} {} {}".format(landscapeParameters['FILE'],
landscapeParameters['N'],
landscapeParameters['K'],
landscapeParameters['NUM']))
os.system("./generateScoreTables {} {} {} {}".format(landscapeParameters['FILE'],
landscapeParameters['N'],
landscapeParameters['K'],
landscapeParameters['NUM']))
为了清楚起见,该函数以单个逗号分隔的行查找一系列参数输入,格式为
FILE=example, N=20, K=5, NUM=100
它会接受这些输入并覆盖landscapeParameters
中的默认输入(如果已指定),并使用landscapeParameters
中的值来调用外部程序。
奇怪的是,当我使用landscapeParameters
中的默认参数时,字符串格式似乎无法正常工作。我的意思是,如果函数读取行:
FILE=example, N=20, K=5, NUM=100
一切正常,print语句打印:
./generateScoreTables example 20 5 100
但是,如果函数读取行:
FILE=example, N=20, K=5
我离开NUM
以使用默认参数时,我得到以下输出:
./generateScoreTables testland1 15
0 100
Segmentation fault
sh: 2: 0: not found
格式似乎没有正确格式化此字符串,但我不明白为什么。有没有人对此有任何见解?
答案 0 :(得分:2)
已经向您指出了这个问题,但我仍然无法发表评论,所以我将其分开。这将涉及重新编写代码。
进入这个阶段后:
parameters = ['FILE=example', 'N=20', 'K=5', 'NUM=100']
# make a list of tuples with [(FILE, default), ('N', 20)...]
pars = [x.split("=") for x in parameters]
现在将每个twople转换为字典dict_of_pars
中的Key,value对dict_of_pars = {k: v for k, v in pars}
#dictionary with values for a single line
# {'FILE': 'example', 'N': '20', 'K': '5', 'NUM': '100'}
此时您将拥有一个字典,其中包含任何特定行的所有已定义参数。如果你创建一个保存默认值的函数(输出),你可以在调用中使用** dict_of_pars发送一行的可用参数
# define output function with default parameters
def output(FILE='example, N='n', K='k', NUM='num'):
os.system(FILE, N, K, NUM)
现在您可以使用
调用该函数 output(**dict_of_pars) #will unpack the arguments into output function
为文件中的每一行创建其中一个临时词典,将其传递给输出。希望这会有所帮助。
答案 1 :(得分:-1)
您在每个循环中更新相同的变量,因此如果它读取的某行没有特定字段,则会使用上次读取它时的值。
而是在循环内声明一个空字典,如果字典中没有键,则使用.get
函数设置默认值。
def createLandscapes(file):
params = ['FILE','N','K','NUM']
for line in file:
if line == "END LANDSCAPES\n":
break
else:
landscapeParameters = {}
parameters = line.replace(" ", '').split(",")
for parameter in parameters:
parameter = parameter.split("=")
if parameter[0] not in params:
malformedFile()
landscapeParameters[parameter[0]] = parameter[1]
for key in landscapeParameters:
if landscapeParameters[key] == "NULL":
malformedFile()
os.system("./generateScoreTables {} {} {} {}".format(landscapeParameters.get('FILE',''),
landscapeParameters.get('N',''),
landscapeParameters.get('K',''),
landscapeParameters.get('NUM',100)))
你可能需要稍微调整一下,但它应该会给你更多可预测的结果。