我正在尝试从一个范围的函数中得到一些结果,但我不明白为什么该文件为空。该功能正常,因为我可以在使用print时在控制台中看到结果。首先,我正在创建一个正在工作的文件,因为它已创建;输出文件名取自字符串,该部分也正常工作。因此,以下内容在给定路径中创建文件:
report_strategy = open(output_path+strategy.partition("strategy(")[2].partition(",")[0]+".txt", "w")
它创建一个文本文件,其名称取自名为“strategy”的字符串,例如:
strategy = "strategy(abstraction,Ent_parent)"
在输出路径文件夹中创建名为“abstraction.txt”的文件。到现在为止还挺好。但我不能写任何东西到这个文件。我有一些几个整数
maps = (175,178,185)
这是功能:
def strategy_count(map_path,map_id)
以下循环对“maps”范围内的每个项进行计数以返回整数:
for i in maps:
report_strategy.write(str(i), ",", str(strategy_count(maps_path,str(i))))
,文件最后关闭:
report_strategy.close()
现在以下内容:
for i in maps:
print str(i), "," , strategy_count(maps_path,str(i))
确实在控制台中给了我想要的东西:
175 , 3
178 , 0
185 , 1
我缺少什么?!该功能有效,文件已创建。我按照自己的意愿在控制台中看到输出,但我不能在文件中写相同的东西。当然,我关闭了文件。
这是一个程序的一部分,它读取文本文件(实际上是Prolog文件)并运行一个名为Clingo的Answer Set Programming解算器。然后读取输出以查找发生策略的实例(具有特定规则的一系列操作)。整个代码:
import pmaps
import strategies
import generalization
# select the strategy to count:
strategy = strategies.abstraction_strategy
import subprocess
def strategy_count(path,name):
p=subprocess.Popen([pmaps.clingo_path,"0",""],
stdout=subprocess.PIPE,stderr=subprocess.STDOUT,stdin=subprocess.PIPE)
#
## write input facts and rules to clingo
with open(path+name+".txt","r") as source:
for line in source:
p.stdin.write(line)
source.close()
# some generalization rules added
p.stdin.write(generalization.parent_of)
p.stdin.write(generalization.chain_parent_of)
# add the strategy
p.stdin.write(strategy)
p.stdin.write("#hide.")
p.stdin.write("#show strategy(_,_).")
#p.stdin.write("#show parent_of(_,_,_).")
# close the input to clingo
p.stdin.close()
lines = []
for line in p.stdout.readlines():
lines.append(line)
counter=0
for line in lines:
if line.startswith('Answer'):
answer = lines[counter+1]
break
if line.startswith('UNSATISFIABLE'):
answer = ''
break
counter+=1
strategies = answer.count('strategy')
return strategies
# select which data set (from the "pmaps" file) to count strategies for:
report_strategy = open(pmaps.hw3_output_path+strategy.partition("strategy(")[2].partition(",")[0]+".txt", "w")
for i in pmaps.pmaps_hw3_fall14:
report_strategy.write(str(i), ",", str(strategy_count(pmaps.path_hw3_fall14,str(i))))
report_strategy.close()
# the following is for testing the code. It is working and there is the right output in the console
#for i in pmaps.pmaps_hw3_fall14:
# print str(i), "," , strategy_count(pmaps.path_hw3_fall14,str(i))
答案 0 :(得分:1)
write
接受一个参数,该参数必须是一个字符串。它没有像print
这样的多个参数,也没有添加行终止符。
如果您想要print
的行为,那么"打印到文件"选项:
print >>whateverfile, stuff, to, print
看起来很奇怪,不是吗? print函数版本,默认情况下在Python 3中处于活动状态,并在Python 2中使用from __future__ import print_function
启用,具有更好的语法:
print(stuff, to, print, out=whateverfile)
答案 1 :(得分:0)
问题在于write
,因为@ user2357112提到的只有一个参数。解决方案还可以使用+
或join()
:
for i in maps:
report.write(str(i)+ ","+str(strategy_count(pmaps.path_hw3_fall14,str(i)))+"\n")
@ user2357112您的答案可能有一个好处,就是知道您在控制台中的测试调试是否产生了写入答案,您只需要编写它。感谢。