2016-08-15 7 views
0

In dem gleichen Verzeichnis habe ich mehrere Dateien, einige von ihnen sind Beispielmessungen und andere sind Referenzen. Sie sehen wie folgt aus:Wählen Sie bestimmte Dateien aus dem Verzeichnis

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

Die Endung diejenigen 350-353 meine Proben sind, die Endung diejenigen bei 100, 101 und 102 sind die Referenzen. Die gute Sache ist, dass Proben und Referenzen in Zahlen aufeinander folgen.

Ich möchte sie in zwei verschiedenen Listen, Proben und Referenzen trennen.

Eine Idee sollte so etwas wie (nicht funktioniert noch) nicht sein:

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 

So ist die Referenzliste wird den Vornamen angegeben nehmen und die subsequents (gegeben durch die Zahl angegeben). Der ganze Rest wird Proben sein. Irgendwelche Ideen, wie man dies in Python einfügt?

Antwort

2

Sie können glob.glob verwenden, um die Liste aller *.dat Dateien zu erhalten, dann filtern Sie diese Liste mit einem Listenverständnis mit einer Bedingung. In meiner Lösung verwende ich einen regulären Ausdruck, um die Zahl aus dem Dateinamen als Text zu extrahieren. Ich wandle es dann in eine ganze Zahl um und prüfe, ob diese ganze Zahl zwischen ref_from und ref_to liegt. Dies funktioniert auch dann, wenn einige der Referenzdateien zwischen ref_from und ref_to nicht vorhanden sind.

Die Liste der Proben wird durch einen Set-Vorgang erhalten: Sie ist das Ergebnis des Entfernens des Satzes references aus dem Satz data_files. Wir können dies tun, da jeder Dateiname als einzigartig angenommen werden kann.

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 

Alternativ, wenn Sie wissen alle Proben zwischen ref_from und ref_to werden anwesend sein, können Sie loswerden der Funktion ref_filter erhalten und ersetzen

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

mit

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

Vielen Dank @nwk . Kannst du die Rückgabe der Funktion etwas erklären? –

+0

Gern geschehen! Die Anweisung gibt 'True' oder' False' zurück, abhängig davon, ob die aus dem Dateinamen extrahierte Zahl (d. H. Das 'N' in' blablabla_N.dat'; siehe erster Absatz) liegt zwischen 'ref_from' und' ref_to'. – nwk

+0

Netter Trick! Ich wusste nicht, dass das möglich ist: D –

2

Sie kann glob.glob('*.dat') verwenden, um eine Liste aller Dateien zu erhalten und diese Liste dann nach Ihren Kriterien zu zerlegen. Die Scheibe beginnt am Index des ersten Referenznamens und ist so groß wie die Anzahl der Referenzen.

Extrahieren Sie diese Scheibe, um Ihre Referenzen zu erhalten. Löschen Sie diese Scheibe, um Ihre Proben zu erhalten.

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 

Ergebnis:

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

Danke @ Robᵩ! Schöne Lösung! –

-1

versuchen so etwas wie

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

Da 'num_refs' eine' str' ist, was bedeutet 'für die Zahl in num_refs:'? –

+0

Deshalb sage ich "versuche so etwas wie" - dieser Code ist nicht zu 100% fertig. Allerdings habe ich die 'int()' Funktion hinzugefügt, danke. –

0

Sie können es auch tun, ohne glob unter Verwendung des os Paket:

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

Vergessen Sie nicht, 'r''' oder einen zusätzlichen Backslash zu verwenden, um Ihre' \ d's in der Regex zu vermeiden. –

+0

@Rob Hoppla, bearbeitet. –

Verwandte Themen