我正在尝试将带有* .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”强制转换为输出文件?
答案 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
魔法会起作用(所以print
当print >> f, [1,2,3,4]
没有时,它会工作。