2016-07-28 15 views
0

私は1つのディレクトリにファイルを読み込みたい。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ファイルは返されません。

どのように私はこの第2条件を満たすことができます他の状態を失うことなく?

+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と同じ問題がありました。問題は、*は任意の文字に一致しますが、の文字がである必要があります。

ファイルパターンの後に数字がないファイルを選択すると、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

関連する問題