1

我正在尝试将所有带有 *.txt 的文件打印到文本文件中,该文件夹如下所示

\文件夹 file1.txt file2.txt file3.csv

我的 python 代码如下所示:

import glob
for text in glob.glob('*.txt'):
    print text

file=open('output.txt', 'w')
file.write(text)
file.close()

运行此程序后,我进入空闲窗口 file1.txt file2.txt 但我的 output.txt 只有 file2.txt 写入其中。

我认为这将是获得结果的快速方法,有没有办法可以将“文本”全部强制输出文件?

4

4 回答 4

6

实际上,您将整个值放入text输出文件中;text只是不是你想的那样。

唯一text被分配到的地方是在for text in glob.glob('*.txt')循环中。在循环之后,它将保留为分配给它的最后一个值,即'file2.txt'.

有几种方法可以实现您想要做的事情。如果您从命令行而不是 IDLE 运行脚本,则可以执行类似(在 Unix 中)

python my_script.py | tee output.txt

将脚本中的所有输出复制到文件output.txt中,而无需在 Python 代码中执行任何操作,除了普通print的 s。

您也可以直接将其写出来,而不是按照Lattywareprint的建议进行调用,但除非您手动执行两者,否则这不会同时执行。

为了使这更容易一点,您可以编写一个函数来调用,而不是print更方便地进行这两种操作。就像是:

with open('output.txt', 'w') as f:
    def my_print(str):
        print str
        f.write(str + '\n')

    for filename in glob.glob('*.txt'):
        my_print(filename)

如果你真的想使用print语句,你也可以做一些更花哨的事情: reassign sys.stdout,从 Python 执行所有打印的特殊对象。这可能比你需要的更复杂,但如果你想看到它,我会告诉你。

于 2012-10-31T21:44:02.100 回答
4

print()只输出到控制台,仅此而已。如果你想写入文件,那么就这样做。

您需要在循环内写入数据,否则您只会写入的最后一个值text

import glob

with open('output.txt', 'w') as file:
    for filename in glob.glob('*.txt'):
        file.write(filename+'\n')

请注意我添加的换行符file.write(),默认情况下不会这样做。如果您愿意,您自然也可以这样做print()。另一种选择是建立一个列表,然后将项目列表写入文件,但这有点迂回。

请注意我使用该with语句打开文件,这会为您关闭文件,即使出现异常也会这样做,因此保持代码更具可读性和彻底性是一种好习惯。

于 2012-10-31T21:45:31.510 回答
3

这是我使用现代 Python 的方法。

from __future__ import print_function

import glob

with open("output.txt", "w") as fo:
    for name in glob.glob("*.txt"):
        print(name, file=fo)

这会将循环放在上下文管理器中并使用前向兼容的打印功能。

于 2012-10-31T23:08:20.193 回答
1

大多数已经正确提出的解决方案都涉及使用file'write方法,所以这里有一个替代方法,只使用print.

print语句 (/!\ python 2.x) 提供了一种写入文件的简单方法:

with open('myfile.txt', 'w') as f:
    print >> f, 'StuffToWrite'

或者你可以sys.stdout用你的文件替换:

import sys
with open('myfile.txt', 'w') as f:
    sys.stdout = f
    print 'StuffToWrite'

作为参考,您始终可以stdoutsys.__stdout__.


然而,让我坚持这样一个事实,即这些都是快速而肮脏的解决方案。
主要优点是你不必担心你试图写的东西不兼容writeprint魔法会起作用(所以print >> f, [1,2,3,4]会起作用,什么时候f.write([1,2,3,4])不会)。

于 2012-10-31T22:10:11.750 回答