将排序结果写入文件
我有一个简单的函数,用来对字典进行排序:
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 个回答
你写道:
outputfile.writelines sorted(data, key=len, reverse=True)[:3]
什么都没生成。
其实应该会因为缺少括号而产生一个语法错误的异常——如果没有出现这个错误,我猜你可能在用某个(据说)“聪明”的IDE,比如iPython,它会自动帮你加上括号——是这样吗?
你正在打印三行最短的内容,而这三行可能都是空的——这样的话,你的输出文件里就会有三行空行(当然在标准输出上什么也看不到——这就是你所说的“什么都没生成”的意思吗?)。也许你没有正确调用 outputfile.close()
,所以等你检查文件时,它们还在缓冲区里,没有写入磁盘。
正如你所看到的,关于你模糊的“什么都没生成”的说法,有很多可能性。你能否明确说明你使用的具体环境,以及你是如何检查你的代码“生成”了什么或没有生成什么的?否则,很难给你提供帮助。
编辑:提问者澄清并展示了他的代码——问题现在很清楚:他第一次完全读取了 inputfile
,从来没有“回退”它,所以在第二次调用 readlines
时,文件立刻结束(里面没有剩下的行)。如果你确实需要独立读取文件两次(而不是像正常情况那样只读取一次并传递数据),你需要在每次读取之前调用 inputfile.seek(0)
来“回退文件”,这样才能重新读取。
writelines
是一个方法,你需要去调用它:
outputfile.writelines(sorted(data, key=len, reverse=True)[:3])
注意
函数 open
提供了一个文件句柄,这个句柄只能遍历一次。你在你的 do_something_with_input
函数中进行了遍历,遍历完 inputfile
后,迭代器就用完了。这意味着如果你再尝试遍历,比如在你的 write_results
函数中,就会得到一个空的结果。所以,输出文件里什么都没有写进去。简单来说,这就相当于:
>>> a = (i for i in range(2))
>>> list(a)
[0, 1]
>>> list(a)
[]
你需要做的是把 sorted(...)
的结果存下来,然后再写入文件,而不是试图重新生成它。