将排序结果写入文件

1 投票
2 回答
3238 浏览
提问于 2025-04-16 00:23

我有一个简单的函数,用来对字典进行排序:

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

你写道:

outputfile.writelines sorted(data, key=len, reverse=True)[:3]

什么都没生成。

其实应该会因为缺少括号而产生一个语法错误的异常——如果没有出现这个错误,我猜你可能在用某个(据说)“聪明”的IDE,比如iPython,它会自动帮你加上括号——是这样吗?

你正在打印三行最短的内容,而这三行可能都是空的——这样的话,你的输出文件里就会有三行空行(当然在标准输出上什么也看不到——这就是你所说的“什么都没生成”的意思吗?)。也许你没有正确调用 outputfile.close(),所以等你检查文件时,它们还在缓冲区里,没有写入磁盘。

正如你所看到的,关于你模糊的“什么都没生成”的说法,有很多可能性。你能否明确说明你使用的具体环境,以及你是如何检查你的代码“生成”了什么或没有生成什么的?否则,很难给你提供帮助。

编辑:提问者澄清并展示了他的代码——问题现在很清楚:他第一次完全读取了 inputfile,从来没有“回退”它,所以在第二次调用 readlines 时,文件立刻结束(里面没有剩下的行)。如果你确实需要独立读取文件两次(而不是像正常情况那样只读取一次并传递数据),你需要在每次读取之前调用 inputfile.seek(0) 来“回退文件”,这样才能重新读取。

1

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(...) 的结果存下来,然后再写入文件,而不是试图重新生成它。

撰写回答