我有一个简单的函数来排序字典:
data = inputfile.readlines()
lineData = sorted(data, key=len, reverse=True)[:3]
打印输出:
print sorted(data, key=len, reverse=True)[:3]
生成预期结果,但写入文件:
outputfile.writelines sorted(data, key=len, reverse=True)[:3]
什么都不生成。如何将输出写入文本文件(outputfile)? 完整的代码如下:
import sys, string
inputfilenames, outputfilename = sys.argv[1:-1], sys.argv[-1]
def do_something_with_input(inputfile):
data = inputfile.readlines()
print sorted(data, key=len, reverse=True)[:3]
print sys.path[0]+"/"+ outputfilename
def write_results(outputfile):
data = inputfile.readlines()
outputfile.writelines(sorted(data, key=len, reverse=True)[:3])
for inputfilename in inputfilenames:
inputfile = open(inputfilename, "r")
do_something_with_input(inputfile)
outputfile = open(outputfilename, "w")
write_results(outputfile)
答案 0 :(得分:1)
writelines
是一种方法,您需要调用它:
outputfile.writelines(sorted(data, key=len, reverse=True)[:3])
<强> ETA 强>
函数open
提供文件句柄,可以通过迭代进行迭代。您在do_something_with_input
函数中执行此操作,在inputfile
迭代之后,迭代器已用完。这意味着任何进一步的迭代,例如在write_results
函数中完成的迭代将产生一个空序列。这就是为什么没有写入输出文件的原因。基本上,它相当于:
>>> a = (i for i in range(2))
>>> list(a)
[0, 1]
>>> list(a)
[]
您需要做的是存储sorted(...)
的输出,然后将其写入文件,而不是尝试再次生成。
答案 1 :(得分:0)
你写道:
outputfile.writelines sorted(data, key=len, reverse=True)[:3]
什么都不产生。
它实际上应该生成一个语法错误异常,因为缺少括号 - 如果没有,我想你必须使用一些(据称)“智能”IDE,如iPython代表你放在括号中 - - 是这样吗?
你正在打印三条最短的线,它们可能都是空的 - 应该在你的输出文件中放三条空行(当然对stdout没有任何显示 - 你的意思是什么) “?)。也许你没有正确地调用outputfile.close()
所以当你检查文件时它们仍然被缓冲而不是写入磁盘。
正如您所看到的,围绕您非常模糊的“无所谓”断言存在大量可能性。您能否澄清完全您正在使用的环境以及特别是您正在检查代码“生成”或不生成的内容?否则,你很难帮助你。
编辑:OP澄清并显示了他的代码 - 现在问题很明显:他第一次完全消耗inputfile
,从不“倒退”它,所以立即文件在第二个readlines
电话中结束(没有留下任何行)。如果你确实需要独立读取文件两次(而不是只读一次并传递数据,正常情况下),每次阅读时都需要调用inputfile.seek(0)
来“回放文件”它让它准备好再次阅读。