文件已创建但无法用Python编写

时间:2014-09-29 18:31:08

标签: python file-io

我正在尝试从一个范围的函数中得到一些结果,但我不明白为什么该文件为空。该功能正常,因为我可以在使用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))

2 个答案:

答案 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您的答案可能有一个好处,就是知道您在控制台中的测试调试是否产生了写入答案,您只需要编写它。感谢。