我正在尝试将文件夹中的所有文件名(包括其路径)写入文本文件。我正在做的是:
import os
BASEDIR = r"C:\project 111"
aa = os.listdir(BASEDIR)
text_file = open(os.path.join(BASEDIR, 'all files.txt'), "w")
for b in aa:
c = os.path.join(BASEDIR, b)
text_file.write(c)
text_file.write('\n')
list_open = open(os.path.join(BASEDIR, 'all files.txt'))
read_list = list_open.read()
line_in_list = read_list.split('\n')
number_of_files = sum(1 for line in open(os.path.join(BASEDIR, 'all files.txt')))
print number_of_files
问题是,它没有将所有想要的文件写入文本文件。实际文件数超过500但是它只写了379行。并且文本文件中的最后一行未完成。
问题的原因是什么,我该如何纠正?感谢。
答案 0 :(得分:3)
使用open
函数打开文件后,应该在完成后关闭它,否则行为可能无法预测。
text_file.close()
list_open.close()
更好的方法是使用上下文管理器(即with-as
语句)。然后你根本不用担心关闭它们;一旦超出范围,上下文管理器就会为你做好准备!
with open(os.path.join(BASEDIR, 'all files.txt'), "w") as text_file:
for b in aa:
c = os.path.join(BASEDIR, b)
text_file.write(c)
text_file.write('\n')
with open(os.path.join(BASEDIR, 'all files.txt')) as list_open:
read_list = list_open.read()
line_in_list = read_list.split('\n')
with open(os.path.join(BASEDIR, 'all files.txt') as allfiles:
number_of_files = sum(1 for line in allfiles))
print number_of_files
以上是对上下文管理器的一个很好的介绍:https://www.inkling.com/read/learning-python-mark-lutz-4th/chapter-33/withas-context-managers
答案 1 :(得分:2)
在Python中,更好的推荐解决方案是使用with
语句来打开/写入文件
执行存在块时,with
语句将自动调用close()
:
with open(os.path.join(BASEDIR, 'all files.txt'), "w") as f:
for b in aa:
c = os.path.join(BASEDIR, b)
f.write(c + "\n")
快速修复是对文件对象添加close()调用:
for b in aa:
c = os.path.join(BASEDIR, b)
text_file.write(c)
text_file.write('\n')
// pls add this line
text_file.close()
list_open = open(os.path.join(BASEDIR, 'all files.txt'))
答案 2 :(得分:2)
with
keyword)供参考:
当然还有官方文档:https://docs.python.org/2/tutorial/inputoutput.html
在处理文件对象时,最好使用
with
关键字。这样做的好处是,即使在路上引发异常,文件也会在套件完成后正确关闭。它也比编写等效的try
-finally
块短得多:
>>> with open('workfile', 'r') as f:
... read_data = f.read()
>>> f.closed
True
问题不在于close()
神奇地将数据添加到文件中。问题是大多数操作系统都是智能的,并且具有不同级别/层的缓冲区(或者问题在于并非所有人都阅读文档或进入CS课程)。为了使数据到达磁盘,您需要刷新缓冲区。这是通过file.flush()
完成的。 close()
致电flush()
。
使用上下文管理器(with open...
)隐藏了这种复杂性;所以大多数用例都坚持使用该结构更安全。