将排序结果写入文件

时间:2010-06-24 14:34:27

标签: python

我有一个简单的函数来排序字典:

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)

2 个答案:

答案 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)来“回放文件”它让它准备好再次阅读。