2017-08-06 47 views
0

我正在嘗試使用存儲在datafolder中的12個不​​同的csv文件。我有一個函數可以單獨打開每個文件(openFile)並對數據執行特定的計算。然後我希望能夠對每個文件應用一個函數。這些文件的名稱都與此類似:UOG_001-AC_TOP-Accelerometer-2017-07-22T112654.csv。下面的代碼顯示了我是如何打算的文件讀入中openFile功能:在Python中合併CSV文件的自動化過程

for file in os.listdir(DATA_PATH + 'datafolder/'): 
    if file.endswith('.csv'): 
     abs_path = os.path.abspath(DATA_PATH + 'datafolder/' + file) 
     print(abs_path) 
     data = openFile(abs_path) 
     data2 = someFunction(data) 

我需要合併特定的文件,其中有文件名相同的兩個字母。最後,我應該有6個文件,而不是12個。這些文件不是按照它們需要在數據文件夾中合併的順序存儲的,因爲這最終會導致用於大量文件。這些文件都具有相同的標題

我可以提供兩個字母的列表,這是在正則表達式中使用的文件中的關鍵字?例如

list = ['AC', 'FO', 'CK', 'OR', 'RS', 'IK'] 

有關如何使用或不使用正則表達式實現此操作的任何建議?

+0

你問如何傳遞命令行參數到您的程序? –

+0

爲什麼不簡單地循環使用'str.startswith('AC')'或'in' –

回答

0

您可以遍歷文件樹,然後根據文件名的前兩個字母保存每對需要合併的文件。

fileList = {'AC':[], 'FO':[], 'CK':[], 'OR':[], 'RS':[], 'IK':[]} 
for file in os.listdir(DATA_PATH + 'datafolder/'): 
    if file.endswith('.csv'): #Ensure we are looking at csv 
     #Add the file to its correct bucket based off of the letters in name 
     fileList[extractTwoLettersFromFileName(file)].append(file) 

for twoLetters, files in fileList.items(): 
     mergeFiles(files) 

我沒有提供實現提取字母和合並文件,但從你的問題,你似乎已經有了這種實現。

0

您可以先這麼一個簡單的字符串檢查,再此基礎上,文件名分爲兩組:

letters_list = ['AC', 'FO', 'CK', 'OR', 'RS', 'IK'] 
for letters in letters_list: 
    if letters in filename: 
    filename_list = filename_dict.get(letters, list()) 
    filename_list.append(filename) 
    filename_dict[letters] = filename_list 
0

這裏是pathlibPath對象的創建文件,其名稱結尾的列表「.csv格式。然後,我使用一個函數來檢查每個文件的名稱,以確定您使用正則表達式提及的那些字符串的存在,以便我可以使用它們的關聯文件名創建這些字符串對的列表。請注意,此列表對的長度爲12,並且可以從中恢復文件名。

建立了該列表後,我可以使用groupbyitertools創建在file_kinds列表中共享這些字符串的文件的兩個元素列表。您可以合併這些列表中的項目。

>>> from pathlib import Path 
>>> file_kinds = ['AC', 'FO', 'CK', 'OR', 'RS', 'IK'] 
>>> def try_match(filename): 
...  m = re.search('(%s)'%'|'.join(file_kinds), filename) 
...  if m: 
...   return m.group() 
...  else: 
...   return None 
... 

>>> all_files_list = [(item, try_match(item.name)) for item in list(Path(r'C:/scratch/datafolder').glob('*.csv')) if try_match(item.name)] 
>>> len(all_files_list) 
12 

表達從all_files_list提取完整路徑:

[str(_[0]) for _ in all_files_list] 

>>> for kind, files_list in groupby(all_files_list, key=itemgetter(1)): 
...  kind, [str(_[0]) for _ in list(files_list)] 
... 
('AC', ['C:\\scratch\\datafolder\\UOG_001-AC_A_TOP-Accelerometer-2017-07-22T112654.csv', 'C:\\scratch\\datafolder\\UOG_001-AC__B_TOP-Accelerometer-2017-07-22T112654.csv']) 
('CK', ['C:\\scratch\\datafolder\\UOG_001-CK_A_TOP-Accelerometer-2017-07-22T112654.csv', 'C:\\scratch\\datafolder\\UOG_001-CK__B_TOP-Accelerometer-2017-07-22T112654.csv']) 
('FO', ['C:\\scratch\\datafolder\\UOG_001-FO_A_TOP-Accelerometer-2017-07-22T112654.csv', 'C:\\scratch\\datafolder\\UOG_001-FO__B_TOP-Accelerometer-2017-07-22T112654.csv']) 
('IK', ['C:\\scratch\\datafolder\\UOG_001-IK_A_TOP-Accelerometer-2017-07-22T112654.csv', 'C:\\scratch\\datafolder\\UOG_001-IK__B_TOP-Accelerometer-2017-07-22T112654.csv']) 
('OR', ['C:\\scratch\\datafolder\\UOG_001-OR_A_TOP-Accelerometer-2017-07-22T112654.csv', 'C:\\scratch\\datafolder\\UOG_001-OR__B_TOP-Accelerometer-2017-07-22T112654.csv']) 
('RS', ['C:\\scratch\\datafolder\\UOG_001-RS_A_TOP-Accelerometer-2017-07-22T112654.csv', 'C:\\scratch\\datafolder\\UOG_001-RS__B_TOP-Accelerometer-2017-07-22T112654.csv'])