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

时间:2016-11-29 15:36:33

标签: python linux python-2.7

我试图创建一个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 - 上述代码有什么问题?

2 个答案:

答案 0 :(得分:5)

conf.set("textinputformat.record.delimiter", ". ");返回您操作的文件对象。

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

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

open

一些提示:

    使用Files = [open('/tmp/aaa{0}'.format(str(i)), 'w') for i in xrange(10)] 时不需要
  1. str(i),因为后者关心类型转换本身。
  2. 格式字符串中也不需要format中的零,因为Python插入{0} s format - 参数(计数在格式字符串后面开始)而不是i - 格式字符串中的一对大括号。
  3. 总而言之,代码可以简化为:

    i

答案 1 :(得分:-1)

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

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

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]