将print语句写入文本文件

时间:2012-10-31 21:41:21

标签: python text-files glob

我正在尝试将带有* .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。

我认为这是获得结果的快捷方式,有没有办法可以将“text”强制转换为输出文件?

4 个答案:

答案 0 :(得分:6)

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

text循环中for text in glob.glob('*.txt')被分配的唯一位置。在循环之后,它将保留为分配给它的 last 值,即'file2.txt'

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

的操作
python my_script.py | tee output.txt

将脚本中的所有输出复制到文件output.txt,而不必在Python代码中执行除正常print以外的任何操作。

你也可以直接写出来,而不是将print称为suggested by Lattyware,但除非你手动执行这两项操作,否则不会同时执行这两项操作。

为了使这更容易,您可以编写一个函数来调用而不是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语句,你也可以做一些有点发烧友的事:重新分配sys.stdout,这是从Python完成所有打印的特殊对象。这可能比你需要的更复杂,但如果你想看到它,我会告诉你。

答案 1 :(得分: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语句来打开文件,这会为您关闭文件,即使是异常也是如此,因此最好保持代码的可读性和透彻性。

答案 2 :(得分: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)

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

答案 3 :(得分:1)

已经正确提出的大多数解决方案都涉及使用file的{​​{1}}方法,因此这里只是使用write的替代方案。

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

print

或者您可以将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' 取回终端的原始stdout


然而,让我坚持认为这些是快速而肮脏的解决方案 主要优点是你不必打扰你写的与sys.__stdout__ 不兼容的内容,write魔法会起作用(所以printprint >> f, [1,2,3,4]没有时,它会工作。