2016-07-28 36 views
0

我想要在一個目錄中讀取文件。如何在Python中使用glob模式讀取目錄中的文件?

目錄包含:

ABC1.csv 
ABC1_1.csv 
ABC1_2.csv 
ABC11.csv 
ABC11_1.csv 
ABC11_3.csv 
ABC11_2.csv 
ABC13_4.csv 
ABC13_1.csv 
ABC17_6.csv 
ABC17_2.csv 
ABC17_4.csv 
ABC17_8.csv 

在運行腳本,我想給命令行參數讀取特定文件取決於一些條件:

  1. 如果用戶只給出ABC錯誤消息。
  2. 如果用戶給ABC1,那麼它只能讀取ABC1.csv,ABC1_1.csv和ABC1_2.csv。
  3. 如果用戶給ABC11,則它必須只讀取ABC11.csv,ABC11_1.csv,ABC11_2.csv,ABC11_3.csv。
  4. 如果用戶給ABC13,它必須只讀取ABC13_1.csv,ABC13_4.csv。
  5. 如果用戶給ABC17,那麼它只能讀ABC17_2.csv,ABC17_4.csv,ABC17_6.csv,ABC17_8.csv。

對於這個東西,我創建了一個腳本,但我面臨的問題。

計劃 -

from glob import glob 
import os 
import sys 

file_pattern = '' 
files_list = list() 
arguments = {'ABC', 'PQR', 'XYZ'} 

if len(sys.argv[1:2]) is 1: 
    file_pattern = str(sys.argv[1:2]) 
else: 
    print 'run as <python test.py ABC>' 
    sys.exit(1) 
if file_pattern in arguments: 
    print '<Provide Name with some Number>' 
    sys.exit(1) 

file_pattern = file_pattern.replace('[','').replace(']','').replace('\'','') 

if file_pattern.startswith('ABC',0,3): 
    files_list = glob(os.path.join('<directory name>', str(file_pattern)+'_*.csv')) 
else: 
    print 'No Such File --> ' + str(file_pattern)+ '\t <Provide appropriate Name>' 
    sys.exit(1) 

if files_list: 
    for a_file in sorted(files_list): 
     print a_file 
     #process file 
else: 
    print 'No Such File --> ' + str(file_pattern)+ '\t <Provide appropriate Name>' 
    sys.exit(1) 

此代碼工作正常,但它不符合我的第二個條件。當用戶將ABC1作爲參數,即python test.py ABC1時,它將返回文件ABC1_1.csv,ABC1_2.csv但不返回ABC1.csv文件。

如何在不失去其他條件的情況下滿足第二條件?

+1

我會說,像電話test.py ABC1不會像預期的那樣返回ABC11.csv,而是ABC1 _ *。csv。但是,與您的問題文本相反,它不會返回ABC1.csv。示例代碼的版本是否適合該問題? –

+0

@Jesper Freesbug-是的正確...如果我們刪除(_),那麼它會返回ABC1.csv,ABC11.csv,ABC11_1.csv和所有以ABC1開頭的。但是,我想要清楚地解釋問題,如果您有任何建議嗎? – kit

回答

0

我有一個解決方案。這並不完美,取決於文件夾中是否有其他文件:

file_pattern = 'ABC1' 
files_list = glob(os.path.join('<directory name>', str(file_pattern)+'[!0-9]*')) 
# output: ABC1.csv, ABC1_1.csv, ABC1_2.csv 

file_pattern = 'ABC11' 
files_list = glob(os.path.join('<directory name>', str(file_pattern)+'[!0-9]*')) 
# output: ['.\\ABC11.csv', '.\\ABC11_1.csv', '.\\ABC11_2.csv', '.\\ABC11_3.csv'] 

我和Jesper有同樣的問題。問題是雖然*會匹配任何字符,但它需要a字符!

通過選擇文件模式後沒有數字的文件,我們避免了1-11問題。

+0

@ dodell-是這是不正確的。我想滿足我所有的條件。 – kit

+0

@ dodell-找到了正確的解決方案。請看我的答案。 – kit

1

我嘗試了不同的場景,最終得到了滿足我所有條件的精確解。首先,我檢查用戶輸入文件是否可用,如果可用,則將所有具有相同文件的文件與(_)全部在最後追加匹配文件到同一列表中。

如果用戶輸入的文件不在指定的目錄中,那麼我正在檢查帶有(_)符號的文件,然後將所有文件列入列表。最後遍歷列表並獲得最終結果。

計劃 -

from glob import glob 
import os 
import sys 

file_pattern = '' 
files_list = list() 

arguments = {'ABC', 'PQR', 'XYZ'} 

#checking for user provided argument or not 
if len(sys.argv[1:2]) is 1: 
    file_pattern = str(sys.argv[1:2]) 
else: 
    print 'run as < python test.py <LineName> >' 
    sys.exit(1) 
#replace all unnecessary stuff with ('') 
file_pattern = file_pattern.replace('[','').replace(']','').replace('\'','') 

#checking for line number is provided or not 
if file_pattern in arguments: 
    print '<Provide LineName with some Number>' 
    sys.exit(1) 

flag = True 
#list of all files containing specified directory 
files = os.listdir('<directory name>') 

for file_name in files: 
    if str(file_name) == str(file_pattern)+'.csv': 
     files_list = glob(os.path.join('<directory name>', str(file_pattern)+'_*.csv')) 
     #appending match file also to resultant list 
     files_list.append('<directory name>'+file_name) 
     flag = False 
#if specified file is not present in dir check for filename with (_) 
if flag: 
    files_list = glob(os.path.join('<directory name>', str(file_pattern)+'_*.csv')) 

#checking for list contains items or not 
if files_list: 
    for a_file in sorted(files_list): 
     print a_file 
else: 
    print 'No Such File --> ' + str(file_pattern)+ '\t <Provide appropriate Name1>' 
    sys.exit(1) 

考慮目錄包含ABC1.csv,ABC1_1.csv,ABC1_2.csv,ABC11.csv,ABC11_1.csv,ABC11_3.csv,ABC11_2.csv文件。

輸出方案:

#if input is ABC1 
.\\ABC1.csv 
.\\ABC1_1.csv 
.\\ABC1_2.csv 
#if input is ABC11 
.\\ABC11.csv 
.\\ABC11_1.csv 
.\\ABC11_2.csv 
.\\ABC11_3.csv 
0

你可能要添加一個簡單的檢查了額外的「特殊」情況下,這樣的事情:

if file_pattern.startswith('ABC',0,3): 
    csv_path = os.path.join('.', str(file_pattern)) 
    files_list = glob(csv_path + '_*.csv') 
    # Just check the special case that's not included in the glob above 
    csv_path = csv_path + '.csv' 
    if os.path.isfile(csv_path): 
     files_list.append(csv_path) 
else: 
    print 'No Such File --> ' + str(file_pattern)+ '\t <Provide appropriate Name>' 
    sys.exit(1) 
+0

是的就是這樣。它也工作正常。 – kit

相關問題