2017-02-16 78 views
0

通常,我在Python中逐個遍歷文件。現在我想循環他們逐組。我如何有效地閱讀它們?如何循環讀取文件組?

下面是一個例子來解釋我的問題。

像這樣指定的文件:

group1: m2000_01, m2000_02,..., m2000_12 
group2: m2001_01, m2001_02,...., m2001_12 
..... 
group17: m2016_01, m2016_02,...., m2016_12 

我想讀在同一年文件的批處理計算和循環獨處的時間連續。僞代碼如下:

for year in list[2000,2001,...,2016]: 

    A=open(m2000_01), B=open(m2000_02), C=open(m2000_03).... # reading files section 

    mean2000 = (A + B + C ...)/12 
    #calculation body,how to set varibles for each file.such as A=m2000_01, B=m2000_02, ..., 
    #use a dict to set these files? 

print mean2000, mean2001,..., mean2016 #result I want 

也許我可以做一個列表,然後循環元素列表匹配(鈦硅分子篩)並提取組文件。但是,如果有多組文件和組關鍵詞(如上例中的2000)不規則。有沒有解決類似問題的常用方法?我認爲有一種行之有效的方法,但我不知道如何描述和搜索。如果這個問題很簡單,請原諒我。

+1

你看了看glob模塊? – MKesper

+0

我總是使用os.walk和os.list遍歷文件而不是glob模塊。我正在查看glob模塊的用法。@ MKesper – Cobin

回答

0

這將做

import os 

path = "your\\path" 

all_files = [x for x in os.listdir(path) if os.path.isfile(path + "\\" + x)] 

for year in range(2000, 2017): 
    for file_name in [y for y in all_files if str(year) in y]: 
     sub_file_path = path + "\\" + file_name 
     # read file, insert appropriate code yourself 
+1

也許使用os.path而不是手動加入路徑?我們不知道OP的操作系統。 – MKesper

0

你可以找到和組文件使用os.listdir(),與re正則表達式模塊一起處理,並itertools.groupby()功能做的東西沿着這些路線:

from itertools import groupby 
import os 
import re 

folder_path = 'data_folder' 

pattern = r'm\d\d\d\d_\d\d' 
filenames = [filename for filename in sorted(os.listdir(folder_path)) 
       if re.match(pattern, filename)] 

for k, g in groupby(filenames, lambda filename: filename.split('_')[0]): 
    year = int(k[1:]) 
    year_files = list(g) 
    print('{}: {}'.format(year, year_files)) 

取樣輸出:

2000: ['m2000_01', 'm2000_02', 'm2000_03', 'm2000_04', 'm2000_05', 'm2000_06', 'm2000_07', 'm2000_08', 'm2000_09', 'm2000_10', 'm2000_11', 'm2000_12'] 
2001: ['m2001_01', 'm2001_02', 'm2001_03', 'm2001_04', 'm2001_05', 'm2001_06', 'm2001_07', 'm2001_08', 'm2001_09', 'm2001_10', 'm2001_11', 'm2001_12'] 
2002: ['m2002_01', 'm2002_02', 'm2002_03', 'm2002_04', 'm2002_05', 'm2002_06', 'm2002_07', 'm2002_08', 'm2002_09', 'm2002_10', 'm2002_11', 'm2002_12'] 
+0

我不確定什麼是正則表達式更具可讀性,就像你擁有它或類似的東西一樣:'r'm \ d {4} _ \ d {2}' – Baldrickk

+0

@Baldrickk:在少於5次重複的情況下,我通常只是拼出來 - 大約相同數量的鍵入和等同可讀的IMO,其中4是一個邊緣情況... – martineau