open()不会在for循环中打开文件描述符

2024-04-20 05:37:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个for循环并打开一堆文件描述,但不幸的是,它在for循环中对我不起作用。你知道吗

>>> import os

>>> os.getpid()
6992

>>> open('/tmp/aaa', 'w')
<open file '/tmp/aaa', mode 'w' at 0x7fa7c9645ae0>

>>> for i in xrange(10):
...     open('/tmp/aaa{0}'.format(str(i)), 'w')
...

上面的脚本只打开1个fd:

vagrant@workspace:~$ ls -alht /proc/6992/fd/ | grep tmp
l-wx------ 1 vagrant vagrant 64 Nov 29 15:18 11 -> /tmp/aaa

问题:

1-如何使用for循环打开多个文件描述符?你知道吗

2-以上代码有什么问题?你知道吗


Tags: 文件inimportforosmodeopentmp
2条回答

您需要获取文件描述符,然后在对其执行任何操作之后,关闭它以刷新它。你知道吗

所以你需要更像这样的东西:

for i in range(10):
    f = open('/tmp/aaa{0}'.format(str(i)), 'w')
    # manipulate the file
    f.close()

如果您需要保存这些文件描述符以便稍后在代码中访问它们,您应该将它们保存在某个位置,例如列表。你知道吗

fs = [open('/tmp/aaa{0}'.format(str(i)), 'w') for i in range(10)]
# manipulate files
_ = [f.close() for f in fs]

open返回对其进行操作的文件对象。你知道吗

如果丢弃返回值,Python将对其进行垃圾收集,从而关闭文件。因此,在循环中调用open而不使用返回值是没有用的,因为所有返回的文件对象都将被垃圾收集。你知道吗

您需要的是保存这些文件对象:

Files = [open('/tmp/aaa{0}'.format(str(i)), 'w') for i in xrange(10)]

一些提示:

  1. ^使用format时不需要{},因为后者关心类型转换本身。你知道吗
  2. 格式字符串中的{0}中也不需要零,因为Python插入formats i第个参数(计数从格式字符串之后开始),而不是格式字符串中的第i对大括号。你知道吗

总之,代码可以简化为:

Files = [open('/tmp/aaa{}'.format(i), 'w') for i in xrange(10)]

相关问题 更多 >