2011-07-26 64 views
1

我有一個數據文件夾,每個主題的子文件夾通過一個程序。因此,例如,在數據文件夾中,有Bob,Fred和Tom的文件夾。這些文件夾中的每一個都包含各種文件和子文件夾。不過,我只對每個主題文件夾中包含的'summary.log'文件感興趣。Python文件串聯

我想將Bob,Fred和Tom的'summary.log'文件連接到數據文件夾中的單個日誌文件中。另外,我想爲列出主題號碼的每個日誌文件添加一列。

這是可以在Python中做到的嗎?還是有更簡單的方法來做到這一點?我已經嘗試了許多不同批次的代碼,但他們都沒有完成這項工作。例如,

#!/usr/bin/python 

import sys, string, glob, os 

fls = glob.glob(r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*'); 
outfile = open('summary.log','w'); 
for x in fls: 
     file=open(x,'r'); 
     data=file.read(); 
     file.close(); 
     outfile.write(data); 
outfile.close(); 

給我的錯誤,

​​

我覺得這與數據文件夾包含子文件夾的事實做,但我不知道如何解決它。我也試過,但無濟於事:

from glob import iglob 
import shutil 
import os 

PATH = r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*' 

destination = open('summary.log', 'wb') 
for filename in iglob(os.path.join(PATH, '*.log')) 
    shutil.copyfileobj(open(filename, 'rb'), destination) 
destination.close() 

這給了我一個「無效語法」錯誤的「爲文件名」行,但我不知道該怎麼改變。

回答

1

該語法與使用glob無關。 你忘了 「:」 在該月底聲明:

for filename in iglob(os.path.join(PATH, '*.log')): 
                ^--- missing 

但以下模式工作:

PATH = r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*/*.log' 

destination = open('summary.log', 'wb') 
for filename in iglob(PATH): 
    shutil.copyfileobj(open(filename, 'rb'), destination) 
destination.close() 
0

冒號(:)在for線缺失。 除了你應該使用with,因爲它處理關閉文件(你的代碼不是例外)。

from glob import iglob 
import shutil 
import os 

PATH = r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*' 

with open('summary.log', 'wb') as destination: 
    for filename in iglob(os.path.join(PATH, '*.log')): 
     with open(filename, 'rb') as in_: 
      shutil.copyfileobj(in_, destination) 
0

在你的第一個例子:

import sys, string, glob, os 

不使用sysstringos,所以沒有必要進口的。

fls = glob.glob(r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*'); 

在這裏,你是選擇主題文件夾

fls = glob.glob('/Users/slevclab/Desktop/Acceptability Judgement Task/data/*/summary.log') 

在Python中,沒有必要終止與分號行:既然你有興趣在這些文件夾內summary.log文件,你可以如下改變模式。

outfile = open('summary.log','w') 
for x in fls: 
    file = open(x, 'r') 
    data = file.read() 
    file.close() 
    outfile.write(data) 
outfile.close() 
0

由於VGE's answer顯示,一旦你固定的語法錯誤,你的第二個解決方案的工作。不過需要注意的是更廣泛的解決方案是使用os.walk

>>> import os 
>>> for i in os.walk('foo'): 
...  print i 
... 
('foo', ['bar', 'baz'], ['oof.txt']) 
('foo/bar', [], ['rab.txt']) 
('foo/baz', [], ['zab.txt']) 

這種經歷在開始上面的目錄樹中的所有目錄和維護目錄和文件之間的一個很好的分離。