首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >open()不会在for循环中打开文件描述符

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

Stack Overflow用户
提问于 2016-11-29 15:36:33
回答 2查看 149关注 0票数 1

我正在尝试创建一个for循环并打开一堆文件描述符,但不幸的是,它在for循环中对我不起作用。

代码语言:javascript
复制
>>> 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:

代码语言:javascript
复制
vagrant@workspace:~$ ls -alht /proc/6992/fd/ | grep tmp
l-wx------ 1 vagrant vagrant 64 Nov 29 15:18 11 -> /tmp/aaa

问题:

如何使用for循环打开多个文件描述符?

上面的代码有什么问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-29 15:39:29

open返回您操作的文件对象。

如果放弃返回值,Python将垃圾收集它,从而关闭文件。因此,在循环中不使用返回值调用open是无用的,因为返回的所有文件对象都将被垃圾收集。

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

代码语言:javascript
复制
Files = [open('/tmp/aaa{0}'.format(str(i)), 'w') for i in xrange(10)]

一些小贴士:

  1. 当您使用str(i)时,不需要format,因为后者关心类型转换本身。
  2. 您也不需要格式字符串中的{0}中的零,因为Python插入了formati-th参数(计数在格式字符串之后开始),而不是格式字符串中的i-th一对大括号。

总之,该守则可简化为:

代码语言:javascript
复制
Files = [open('/tmp/aaa{}'.format(i), 'w') for i in xrange(10)]
票数 5
EN

Stack Overflow用户

发布于 2016-11-29 15:41:57

您需要获取文件描述符,并且在您对它做了任何想要做的事情之后,关闭它以使其刷新。

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

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

如果您需要保存这些文件描述符以在稍后的代码中访问它们,则应该将它们保存在某个地方,比如列表。

代码语言:javascript
复制
fs = [open('/tmp/aaa{0}'.format(str(i)), 'w') for i in range(10)]
# manipulate files
_ = [f.close() for f in fs]
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40869774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档