2017-07-16 10 views
1

Alle,Bestimmte Dateien von einem Verzeichnis in ein anderes - Python

Ich brauche Datei von einem Verzeichnis in ein anderes zu bewegen, aber ich will nicht alle Dateien in diesem Verzeichnis verschieben nur die Textdateien, die mit beginnen 'pws'. Ein list aller Dateien im Verzeichnis:

['pws1.txt', 'pws2.txt', 'pws3.txt', 'pws4.txt', 'pws5.txt', 'x.txt', 'y.txt'] 

Wie bereits erwähnt, habe ich die 'pws*' Dateien in ein anderes Verzeichnis verschieben möchten, aber nicht die x- und y-Textdateien. Was ich tun möchte, ist alle Elemente list zu entfernen, die nicht mit 'pws' beginnen. Mein Code ist unten:

loc = 'C:\Test1' 
dir = os.listdir(loc) 

#print dir 

for i in dir: 
#print i 
x = 'pws*' 
if i != x: 
dir.remove(i) 
print dir 

Der Ausgang hält nicht, was ich will, statt

Es entfernt die x Textdatei aus dem list und die gerade Zahl diejenigen, behält aber die y-Textdateien.

Was mache ich falsch. Wie kann ich eine list nur der Dateien machen, die mit 'pws' beginnen und die Textdateien entfernen, die nicht mit 'pws' beginnen.

Denken Sie daran, ich könnte eine list, die 1000 Elemente hat und mehrere hundert dieser Elemente wird mit 'pws' beginnen, während diejenigen, die nicht damit beginnen, paar Hunderte, müssen entfernt werden.

Jedermanns Hilfe wird sehr geschätzt.

+0

Mögliche Duplikat [Wie man eine Datei in Python bewegen] (https://stackoverflow.com/questions/8858008/how-to-move-a-file-in-python) – dlmeetei

Antwort

2

Sie können list-comprehension verwenden, um neu zu erstellen, die list wie die folgenden:

dir = [i for i in dir if i.startswith('pws')] 

oder besser noch, definieren, dass beim Start:

loc = 'C:\\Test1' 
dir = [i for i in os.listdir(loc) if i.startswith('pws')] 
print dir 

Erläuterung:

Wenn Verwenden Sie x = 'pws*' und überprüfen Sie dann auf if i == x, Sie vergleichen, wenn das Element i ist gleich 'pws*', so ist ein besserer Weg, str.startswith() eingebaute Methode zu verwenden, die prüft, ob die string beginnt mit der bereitgestellten substring. Also in Ihrem loop können Sie if i.startswith('pws') verwenden oder Sie können list-comprehension verwenden, wie ich oben erwähnt, die ein pythonischer Ansatz ist.

+0

Vielen Dank. Ich habe den bearbeiteten Code ausgeführt, aber ich bekomme immer einen Syntaxfehler in Bezug auf "for" in dir = [i für i in .... – duranil

+0

@duranil ändere diese Zeile 'loc = 'C: \ Test1'' in' loc =' C: \\ Test1'', weil du den Backlashes entkommen musst –

0

Um eine Datei zu verschieben: How to move a file in Python Sie können

origin = r'C:\users\JohnDoe\Desktop' 
destination = r'C:\users\JohnDoe\Desktop\Test' 
startswith_ = 'pws' 

os.rename (Ursprung, Ziel) verwenden Und dann gehen Sie vor und tun, um eine Liste Verständnis

# Move files 
[os.rename(os.path.join(origin,i),os.path.join(destination,i)) for i in os.listdir(origin) if i.startswith(startswith_)] 
0

Nur eine glob .Dies gibt Ihnen eine Liste von Dateien in einem Verzeichnis ohne die alle listdir Anrufe und Teilzeichenfolge Matching:

import glob,os 
for f in glob.glob('/tmp/foo/pws*'): 
    os.rename(f, '/tmp/bar/%s'%(os.path.basename(f))) 

Edit 1: Hier ist Ihre Original-Code, mit einem glob vereinfacht und eine neue Variable loc2 definiert der Ort sein, um bewegen sie:

import os,glob 
loc = 'C:\Test1' 
loc2 = 'C:\Test2' 
files = glob.glob('%s\pws*'%(loc)) 

for i in files: 
    os.rename(i,'%s\%s'%(loc2,os.path.basename(i))) 
+0

Danke. Der Code tut nichts. – duranil

+0

@duranil, der Code tut sicherlich _something_. Welcher Teil funktioniert nicht? Bietet der Glob die Liste der erwarteten Dateien? Bewegt der os.rename sie nicht zum Ziel? – CDahn

Verwandte Themen