python - 在 Python 中关闭文件的显式方法

标签 python file

请看下面的代码:

for i in xrange(1,5000):
    with open(r'test\test%s.txt' % i, 'w') as qq:
        qq.write('aa'*3000)

它似乎是按照所有 Python 规则编写的;使用后文件正在关闭。好像。但实际上它似乎建议(!)系统关闭文件,而不是明确关闭它,因为当我查看资源监视器时它显示了很多打开的文件。它给我带来了很多问题,因为在我的脚本中我使用了很多文件,很长一段时间后,尽管从源代码中“关闭”了它,但我还是收到了“太多打开的文件”错误。

有没有办法在 Python 中显式关闭文件?或者我如何检查文件是否真的(!)关闭了?

更新:我刚刚尝试使用另一个监控工具 - 来自 Sysinternals 的 Handle,它显示一切正确,我相信它。所以,这可能是资源监视器本身的问题。

显示打开文件的屏幕截图:

Resource Monitor with the script running

最佳答案

你的代码

for i in xrange(1, 5000):
    with open(r'test\test%s.txt' % i, 'w') as qq:
        qq.write('aa' * 3000)

在语义上完全等同于

for i in xrange(1, 5000):
    qq = open(r'test\test%s.txt' % i, 'w')
    try:
        qq.write('aa' * 3000)
    finally:
        qq.close()

因为对文件使用 with 是一种确保在离开 with block 后立即关闭文件的方法。

所以你的问题一定出在其他地方。

可能是使用的Python环境版本有bug,fclose()由于某种原因没有被调用。

但是你可以尝试类似的东西

try:
    qq.write('aa' * 3000)
finally:
    # qq.close()
    os.close(qq.fileno())

直接进行系统调用。

关于python - 在 Python 中关闭文件的显式方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25176168/

相关文章:

java - FileChannel 和 Socket 之间传输文件

python - 注意到在 Python 中使用 BeautifulSoup 限制抓取结果的警告

python - "Worksheet range names does not exist"openpyxl KeyError

javascript - 上传到 Google Cloud Storage 时获取 403 SignatureDoesNotMatch?

python - 将标准错误直接发送到同一文件和标准输出?

java - 将文档写入文件 jsoup

python - 如何处理 Linux/Python 依赖?

python - 命令行 - int() 参数必须是字符串、类似字节的对象或数字,而不是 'list'

java - 使用 APACHE POI 处理 docx 文件

java - 在使用 Java 读取文件时,如何从一行文本中提取名称和值?