2016-11-29 194 views
1

我正在嘗試創建for循環並打開一堆文件描述符,但不幸的是它在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:

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

問題:

1 - 如何使用循環打開多個文件描述符?

2 - 上述代碼有什麼問題?

回答

5

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

如果放棄返回值,Python會將其垃圾收集起來,從而關閉文件。因此,在不使用返回值的循環中調用open是無用的,因爲所有返回的文件對象都將被垃圾收集。

你想要的是保存這些文件對象:

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

一些提示:

  1. str(i)當您使用format約類型轉換本身後者憂慮是不必要的。
  2. 你不需要在{0}零格式字符串以及因爲Python插入format小號i個參數(計數格式字符串後開始),而不是i個對格式字符串括號。

總而言之,代碼可以簡化爲:

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

哇,非常感謝。沒有意識到gc部分是公開的。 – Vor

+0

@Vor,垃圾收集器不關心這是否是一個文件。它破壞了對象。文件對象通常在銷燬時關閉其文件描述符。 – ForceBru

+0

我看到了,我看到第一個,因爲它不是垃圾收集('foo = _') – Vor

-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] 
+1

他們希望所有這些文件在循環後仍然打開。不幸的是,你的答案中的代碼與OP的代碼幾乎相同。 – ForceBru

+0

感謝@ForceBru,因此編輯。 – adrin