2016-08-15 26 views
0

同じディレクトリにいくつかのファイルがありますが、そのうちのいくつかはサンプル測定値であり、その他は参照ファイルです。ディレクトリから特定のファイルを選択してください。

blablabla_350.dat 
blablabla_351.dat 
blablabla_352.dat 
blablabla_353.dat 
... 
blablabla_100.dat 
blablabla_101.dat 
blablabla_102.dat 

350から353で終わるものは私のサンプルで、100,101および102で終わるものは参照です。良いことは、サンプルと参照が連続していることです。

2つの異なるリスト、サンプル、および参考文献でそれらを区別したいと思います。

import glob 

samples = [] 
references = [] 

ref = raw_input("Enter first reference name: ") 
num_refs = raw_input("How many references are? ") 

ref = sorted(glob.glob(ref+num_refs)) 

samples = sorted(glob.glob(*.dat)) not in references 

だから参照リストは、指定された最初の名前と(指定された数によって与えられた)subsequentsがかかります。

ひとつのアイデアは、(まだ動作していない)のようなものでなければなりません。残りはすべてサンプルになります。 これをPythonに入れる方法はありますか?

答えて

2

glob.globを使用してすべての*.datファイルのリストを取得し、条件付きリスト内包表を使用してそのリストをフィルタリングすることができます。私の解決方法では、正規表現を使用してファイル名から数字をテキストとして抽出します。私はそれを整数に変換し、その整数がref_fromref_toの間にあるかどうかをチェックします。 ref_fromref_toの間に番号が付けられた参照ファイルの一部が欠落している場合でも、これは機能します。

サンプルのリストは、のセットをdata_filesのセットから削除した結果のセット操作によって取得されます。すべてのファイル名はすべて一意であると仮定できるので、これを行うことができます。あなたはref_fromref_to間のすべてのサンプルが存在するとしている知っていれば

import glob 
import re 

samples = [] 
references = [] 

ref_from = 350 
ref_to = 353 

def ref_filter(filename): 
    return ref_from <= int(re.search('_([0-9]+).dat', filename).group(1)) <= ref_to 

data_files = sorted(glob.glob("*.dat")) 
references = [filename for filename in data_files if ref_filter(filename)] 
samples = list(set(data_files) - set(references)) 

print references 
print samples 

あるいは、あなたは機能ref_filterを取り除くと

references = [filename for filename in data_files if ref_filter(filename)] 

references = ['blablabla_' + str(n) + '.dat' for n in xrange(ref_from, ref_to + 1)] 
+0

おかげで多くのことを@nwk 。関数のreturn文を少し説明できますか? –

+0

よろしくお願いします!この文は、ファイル名から抽出された番号(すなわち、「blablabla_N」の「N」)に応じて、「真」または「偽」を返す。dat ';最初の段落を参照)は 'ref_from'と' ref_to'の間にあります。 – nwk

+0

素敵なトリック!私はこれができることを知らなかった:D –

2

あなたを置き換えることができますglob.glob('*.dat')を使用してすべてのファイルの一覧を取得し、その一覧に基づいてその条件に基づいてスライスすることができます。スライスは、最初の参照名のインデックスから始まり、参照数と同じ大きさになります。

参照を取得するためにそのスライスを抽出します。そのスライスを削除してサンプルを入手してください。

import glob 

samples = [] 
references = [] 

ref = raw_input("Enter first reference name: ")  # blablabla_100.dat 
num_refs = int(raw_input("How many references are? ")) # 3 

all_files = sorted(glob.glob('*.dat')) 
first_ref = all_files.index(ref) 
ref_files = all_files[first_ref:first_ref+num_refs] 

sample_files = all_files 
del sample_files[first_ref:first_ref+num_refs] 
del all_files 

print ref_files, sample_files 

結果:

['blablabla_100.dat', 'blablabla_101.dat', 'blablabla_102.dat'] ['blablabla_350.dat', 'blablabla_351.dat', 'blablabla_352.dat', 'blablabla_353.dat'] 
+0

ありがとう@Robᵩ!ニースの解決策! –

-1

あなたはまた、osパッケージ使用しglobせずにそれを行うことができます

import glob 

samples = [] 
references = [] 

ref = raw_input("Enter first reference name: ") 
num_refs = int(raw_input("How many references are? ")) 

for number in num_refs: 
    refferences.append(ref+number) 

for filename in sorted(glob.glob('*.dat')): 
    if filename not in refferences: 
     samples.append(filename) 
+0

'num_refs'は' str'なので、 'num_refs:'の 'forは何ですか? –

+0

だから私は "何かのように試して"言う - このコードは100%完成していません。 しかし、 'int()'関数を追加しました。ありがとうございます。 –

0

のようなものを試してください:

import os, re 

files = os.listdir(r'C:\path\to\files') 
samples, references = [], [] 
for file in files: 
    if re.search(r'blablabla_1\d{2}', file): 
     references.append(file) 
    elif re.serach(r'blablabla_3\d{2}', file): 
     samples.append(file) 
    else: 
     print('{0} is neither sample nor reference'.format(file)) 
+0

正規表現で '\ d'をエスケープするために' r'''や余分なバックスラッシュを使うのを忘れないでください。 –

+0

@RobOops編集されました。 –

関連する問題