使用os.listdir()在TXT中写入文件名但未完成

时间:2014-11-14 06:58:55

标签: python file

我正在尝试将文件夹中的所有文件名(包括其路径)写入文本文件。我正在做的是:

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行。并且文本文件中的最后一行未完成。

问题的原因是什么,我该如何纠正?感谢。

3 个答案:

答案 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...)隐藏了这种复杂性;所以大多数用例都坚持使用该结构更安全。