Seite 1 von 2

Probleme mit shutil.move ?

Verfasst: Freitag 16. Januar 2015, 13:06
von JoB
Würde gerne Daten verschieben, komme aber nicht weiter. Was mache ich falsch?

Code: Alles auswählen

import shutil, os, sys
# import numpy as np

QFile = "R:\\natura 2000\\SG-Besprechungen\\Migration2015_Q.txt"
ZFile = "R:\\natura 2000\\SG-Besprechungen\\Migration2015_Z.txt"

##QFile = r"R:\natura 2000\SG-Besprechungen\Migration2015_Q.txt"
##ZFile = r"R:\natura 2000\SG-Besprechungen\Migration2015_Z.txt"

f = open(QFile, 'r')
for line in f:
    print(line)
    # print f.readline
    f1 = open(ZFile, 'r')
    for line1 in f1:
        print(line1)

        shutil.move(line, line1)
Folgende Fehlermeldung:
IOError: [Errno 22] invalid mode ('rb') or filename: 'C:\\temp2\n'

Re: Probleme mit shutil.move ?

Verfasst: Freitag 16. Januar 2015, 13:17
von Hyperion
JoB hat geschrieben:Würde gerne Daten verschieben, komme aber nicht weiter. Was mache ich falsch?
Alles :-D

shutil.move verschiebt *Dateien*. Also muss man ihm sagen, *welche* Quelldatei *wohin* soll. Steht doch auch gut dokumentiert.

Schmeiß also alle ``open`` und Schleifen raus und nutze die Funktion wie vorgesehen.

Re: Probleme mit shutil.move ?

Verfasst: Freitag 16. Januar 2015, 13:20
von MagBen
Du musst das '\n' entfernen, probier mal

Code: Alles auswählen

shutil.move(line.strip(), line1.strip())

Re: Probleme mit shutil.move ?

Verfasst: Freitag 16. Januar 2015, 13:35
von JoB
Vielen Dank MagBen, dass wars ...
Schon länger rumprobiert, deswegen umso größere Freude

Re: Probleme mit shutil.move ?

Verfasst: Freitag 16. Januar 2015, 13:36
von JoB
Lieber moderator,
hol die Pfade zum move aus 2 txt, deswegen ist doch nicht alles falsch?
Zumindest funktioniert es für meine Ansprüche :-)

Re: Probleme mit shutil.move ?

Verfasst: Freitag 16. Januar 2015, 14:08
von Sirius3
@JoB: jetzt bricht das Programm halt mit dem zweiten move ab, weil die Datei nicht (mehr) existiert.

Re: Probleme mit shutil.move ?

Verfasst: Freitag 16. Januar 2015, 15:47
von mcdwerner
@JoB: zu meinem Verständnis, die Dateien sind so aufgebaut, dass:
QFile[Zeile1] nach ZFile[Zeile1] und
QFile[Zeile2] nach ZFile[Zeile2]
usw... verschoben werden soll?

Falls JA: dann überleg Dir mal, wie oft in Deiner Version shutil.move() aufegrufen wird und warum das so ist ;-)

Re: Probleme mit shutil.move ?

Verfasst: Freitag 16. Januar 2015, 16:06
von Hyperion
JoB hat geschrieben:Lieber moderator,
hol die Pfade zum move aus 2 txt, deswegen ist doch nicht alles falsch?
Zumindest funktioniert es für meine Ansprüche :-)
Dann schreib das doch bitte das nächste Mal ;-)

Dateien sollte man immer mittels ``with open(...) as file_handler`` öffnen (spart das explizite Schließen und tut das auch sauber im Exceptionfall!).

Ich würde mir auch eine Funktion schreiben, die die korrespondierenden Dateinamen als Tupel liefert und dann das ``shutil.move`` separat aufrufen, also in etwa so:

Code: Alles auswählen

def get_filenames_from(filename):
    with open(filename) as f:
        for path in f:
            yield f

def main():
    sources = get_filenames_from("...")
    destinations = get_filenames_from("...")
    for source, destination in zip(sources, destinations):
        shutil.move(source, destination)

Re: Probleme mit shutil.move ?

Verfasst: Montag 19. Januar 2015, 15:22
von JoB
mcdwerner hat geschrieben:@JoB: zu meinem Verständnis, die Dateien sind so aufgebaut, dass:
QFile[Zeile1] nach ZFile[Zeile1] und
QFile[Zeile2] nach ZFile[Zeile2]
usw... verschoben werden soll?

Falls JA: dann überleg Dir mal, wie oft in Deiner Version shutil.move() aufegrufen wird und warum das so ist ;-)
Korrekt :-)

Aha

Re: Probleme mit shutil.move ?

Verfasst: Montag 19. Januar 2015, 15:25
von JoB
So damit es noch lustiger wird für euch sollen nur bestimmte Ordner eines Verzeichnisses verschoben werden:

Code: Alles auswählen

import shutil, os, sys, re, fnmatch
from glob import glob
# import numpy as np

##QFile = "R:\\natura 2000\\SG-Besprechungen\\Migration2015_Q_Test.txt"
##ZFile = "R:\\natura 2000\\SG-Besprechungen\\Migration2015_Z_Test.txt"

##QFile = r"R:\natura 2000\SG-Besprechungen\Migration2015_Q.txt"
##ZFile = r"R:\natura 2000\SG-Besprechungen\Migration2015_Z.txt"


QFile = "R:\\natura 2000\\SG-Besprechungen\\Migration2015_Q_MaPOrdner.txt"
ZFile = "R:\\natura 2000\\SG-Besprechungen\\Migration2015_Z_MaPOrdner.txt"
Src = r"R:\natura 2000\8847.04 MaP"

## MaPString = "\\6417-341_Weschnitz_Bergstrasse_Odenwald", "\\6517-341*", "\\6518-341_301*", "\\6521-311*", "\\6617-341*", "\\6620-341*", "\\6620-342*", "\\6717-341*", "\\6718-311*", "\\6816-341*", "\\6916-342_6916-441*", "\\6917-311*", "\\6917-342*", "\\6918-311*", "\\7016_343*", "\\7016-341*", "\\7016-342_401*", "\\7017_342*", "\\7017-341*", "\\7018-341*", "\\7114-311*", "\\7116-342*", "\\7117-341*", "\\7118-341*", "\\7119-341*", "\\7214-341*", "\\7214-342*", "\\7214-343*", "\\7215-341*", "\\7216-341*", "\\7218-341*", "\\7315-311*", "\\7316-341*", "\\7317-341*", "\\7319-341*", "\\7515-341*", "\\7516-341*", "\\7519-341*", "\\7616-341*"
MaPString = "\\6421-311*", "\\6517-341*", "\\6518-341_301*", "\\6521-311*", "\\6617-341*", "\\6620-341*", "\\6620-342*", "\\6717-341*", "\\6718-311*", "\\6816-341*", "\\6916-342_6916-441*", "\\6917-311*", "\\6917-342*", "\\6918-311*", "\\7016_343*", "\\7016-341*", "\\7016-342_401*", "\\7017_342*", "\\7017-341*", "\\7018-341*", "\\7114-311*", "\\7116-342*", "\\7117-341*", "\\7118-341*", "\\7119-341*", "\\7214-341*", "\\7214-342*", "\\7214-343*", "\\7215-341*", "\\7216-341*", "\\7218-341*", "\\7315-311*", "\\7316-341*", "\\7317-341*", "\\7319-341*", "\\7515-341*", "\\7516-341*", "\\7519-341*", "\\7616-341*"

f = open(QFile, 'r')
for line in f:
    # print(line)
    for x in MaPString:
        # print (x)
        
##        for file in Src:
##            if fnmatch.fnmatch(file, (x.strip())):
##                print (file)
            
        f1 = open(ZFile, 'r')
        for line1 in f1:
            # print(line1)
        
##            shutil.move(line.strip(), line1.strip())
##            shutil.move(glob(x.strip()), line1.strip())
##            shutil.move(Src + x.strip(), line1.strip())

##            shutil.move(Src + x.strip(), line1.strip())
            
##            print (re.search((x.strip(), Src , re.M|re.I)))
##            print ((re.match((x.strip(), Src , re.M|re.I))).rstrip())
            print(Src + x.strip(), line1.strip())

Kopiert mit der Wildcard * allerdings nichts?

Anregungen, Fragen, Tipps usw. gerne?

Re: Probleme mit shutil.move ?

Verfasst: Montag 19. Januar 2015, 15:27
von JoB
Hyperion hat geschrieben:
JoB hat geschrieben:Lieber moderator,
hol die Pfade zum move aus 2 txt, deswegen ist doch nicht alles falsch?
Zumindest funktioniert es für meine Ansprüche :-)
Dann schreib das doch bitte das nächste Mal ;-)

Dateien sollte man immer mittels ``with open(...) as file_handler`` öffnen (spart das explizite Schließen und tut das auch sauber im Exceptionfall!).

Ich würde mir auch eine Funktion schreiben, die die korrespondierenden Dateinamen als Tupel liefert und dann das ``shutil.move`` separat aufrufen, also in etwa so:

Code: Alles auswählen

def get_filenames_from(filename):
    with open(filename) as f:
        for path in f:
            yield f

def main():
    sources = get_filenames_from("...")
    destinations = get_filenames_from("...")
    for source, destination in zip(sources, destinations):
        shutil.move(source, destination)
Warum, ich will doch für jede Schleife einmal verschieben?

Re: Probleme mit shutil.move ?

Verfasst: Montag 19. Januar 2015, 16:33
von MagBen
Schau Dir mal das Modul os an.

Code: Alles auswählen

src_files1 = os.listdir(src)
gibt Dir alle Datei und Verzeichnisnamen des Verzeichnisses src in einer Liste zurück.

Code: Alles auswählen

src_files2 = filter(lambda f: f.startswith("7315-311"), src_files1)
filtert Dir alle Dateien (und Verzeichnisse) die mit "7315-311" beginnen.

Code: Alles auswählen

os.path.join(src, x)
verbindet den Pfad src und den Dateinamen zu einem Plattformspezifischen Pfad. Damit sparst Du Dir die ganzen hässlichen "\\":

Code: Alles auswählen

MaPString = "6421-311*", "6517-341*", "6518-341_301*", "6521-311*", "6617-341*", "6620-341*", "6620-342*", "6717-341*", "6718-311*",
Das strip() brauchst Du nur, wenn jeder Dateiname als Zeile in einer Datei steht, da das Zeilenende "\n" eben zur Dateizeile dazugehört, aber nicht zum Dateipfad. Der Programmvorschlag von Hyperion enthält zwar zwei zusätzliche Funktionen (main, get_filenames_from) aber auch den gleichen Fehler ("\n" wird nicht entfernt), wie in Deinem ersten Ansatz.

Re: Probleme mit shutil.move ?

Verfasst: Montag 19. Januar 2015, 16:36
von Hyperion
JoB hat geschrieben: Warum, ich will doch für jede Schleife einmal verschieben?
Du hattest oben *bestätigt*, dass Du für jede Pfadangabe in der Quelldatei *genau eine korrespondierende* Zeile in der Zieldatei hast. Genau das berücksichtigt mein Snippet.

Re: Probleme mit shutil.move ?

Verfasst: Montag 19. Januar 2015, 16:39
von Hyperion
MagBen hat geschrieben: Der Programmvorschlag von Hyperion enthält zwar zwei zusätzliche Funktionen (main, get_filenames_from) aber auch den gleichen Fehler ("\n" wird nicht entfernt), wie in Deinem ersten Ansatz.
Auf Kleinigkeiten habe ich nicht geachtet ;-) Aber das ist ja nur ein simples Bugfixing: ``yield f.strip()``

Re: Probleme mit shutil.move ?

Verfasst: Dienstag 20. Januar 2015, 04:34
von cofi
Hyperion hat geschrieben:
JoB hat geschrieben: Warum, ich will doch für jede Schleife einmal verschieben?
Du hattest oben *bestätigt*, dass Du für jede Pfadangabe in der Quelldatei *genau eine korrespondierende* Zeile in der Zieldatei hast. Genau das berücksichtigt mein Snippet.
Ergaenzend: Willst du tatsaechlich eine Datei mehrfach "verschieben", dann willst du sie eigentlich kopieren (und den Ursprung am Ende loeschen).

Re: Probleme mit shutil.move ?

Verfasst: Dienstag 20. Januar 2015, 07:54
von JoB
So vielen Dank für den Support, allerdings verschiebt sich immernoch nichts :-)
Aber die beiden Pfade mit der Wildcard stimmen?

Code: Alles auswählen

import shutil, os, sys, re, fnmatch
from glob import glob
# import numpy as np

##QFile = "R:\\natura 2000\\SG-Besprechungen\\Migration2015_Q_Test.txt"
##ZFile = "R:\\natura 2000\\SG-Besprechungen\\Migration2015_Z_Test.txt"

##QFile = r"R:\natura 2000\SG-Besprechungen\Migration2015_Q.txt"
##ZFile = r"R:\natura 2000\SG-Besprechungen\Migration2015_Z.txt"


QFile = "R:\\natura 2000\\SG-Besprechungen\\Migration2015_Q_MaPOrdner.txt"
ZFile = "R:\\natura 2000\\SG-Besprechungen\\Migration2015_Z_MaPOrdner.txt"
Src = r"R:\natura 2000\8847.04 MaP"
src_files1 = os.listdir(Src)
    
## MaPString = "\\6417-341_Weschnitz_Bergstrasse_Odenwald", "\\6517-341*", "\\6518-341_301*", "\\6521-311*", "\\6617-341*", "\\6620-341*", "\\6620-342*", "\\6717-341*", "\\6718-311*", "\\6816-341*", "\\6916-342_6916-441*", "\\6917-311*", "\\6917-342*", "\\6918-311*", "\\7016_343*", "\\7016-341*", "\\7016-342_401*", "\\7017_342*", "\\7017-341*", "\\7018-341*", "\\7114-311*", "\\7116-342*", "\\7117-341*", "\\7118-341*", "\\7119-341*", "\\7214-341*", "\\7214-342*", "\\7214-343*", "\\7215-341*", "\\7216-341*", "\\7218-341*", "\\7315-311*", "\\7316-341*", "\\7317-341*", "\\7319-341*", "\\7515-341*", "\\7516-341*", "\\7519-341*", "\\7616-341*"
MaPString = "6421-311*", "6517-341*", "6518-341_301*", "6521-311*", "6617-341*", "6620-341*", "6620-342*", "6717-341*", "6718-311*", "6816-341*", "6916-342_6916-441*", "6917-311*", "6917-342*", "6918-311*", "7016_343*", "7016-341*", "7016-342_401*", "7017_342*", "7017-341*", "7018-341*", "7114-311*", "7116-342*", "7117-341*", "7118-341*", "7119-341*", "7214-341*", "7214-342*", "7214-343*", "7215-341*", "7216-341*", "7218-341*", "7315-311*", "7316-341*", "7317-341*", "7319-341*", "7515-341*", "7516-341*", "7519-341*", "7616-341*"

src_files2 = filter(lambda f: f.startswith(MaPString), src_files1)
# print (src_files2)

f = open(QFile, 'r')
for line in f:
    # print(line)
    for x in MaPString:
        # print (x)
        src_file3 = os.path.join(Src, x)
        # print (os.path.join(Src, x))
##        
##        for file in Src:
##            if fnmatch.fnmatch(file, (x.strip())):
##                print (file)
##            
        f1 = open(ZFile, 'r')
        for line1 in f1:
            # print(line1)
##        
##            shutil.move(line.strip(), line1.strip())
##            shutil.move(glob(x.strip()), line1.strip())
##            shutil.move(Src + x.strip(), line1.strip())

##            shutil.move(src_file3, line1.strip())
            
##            print (re.search((x.strip(), Src , re.M|re.I)))
##            print ((re.match((x.strip(), Src , re.M|re.I))).rstrip())
##            print(Src + x.strip(), line1.strip())
            print(src_file3, line1.strip())
('R:\\natura 2000\\8847.04 MaP\\6421-311*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\6517-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\6518-341_301*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\6521-311*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\6617-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\6620-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\6620-342*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\6717-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\6718-311*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\6816-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\6916-342_6916-441*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\6917-311*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\6917-342*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\6918-311*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7016_343*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7016-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7016-342_401*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7017_342*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7017-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7018-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7114-311*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7116-342*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7117-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7118-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7119-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7214-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7214-342*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7214-343*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7215-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7216-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7218-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7315-311*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7316-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7317-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7319-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7515-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7516-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7519-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')
('R:\\natura 2000\\8847.04 MaP\\7616-341*', 'R:\\SG-C\\8850.20-6 FFH-Gebiete\\04 MaP')

Re: Probleme mit shutil.move ?

Verfasst: Dienstag 20. Januar 2015, 08:01
von Sirius3
@JoB: shutil.move kommt nicht mit Wildcards klar, die mußt Du schon selbst auflösen, z.B. mit glob.glob. QFile, line, src_files2 und damit src_files1 und Src werden gar nicht benutzt.

Re: Probleme mit shutil.move ?

Verfasst: Dienstag 20. Januar 2015, 10:56
von JoB
Verstehe ich leider nicht sirius?

Re: Probleme mit shutil.move ?

Verfasst: Dienstag 20. Januar 2015, 11:04
von Sirius3
@JoB: was verstehst Du nicht?
Wildcards sind in Deinem Fall die '*', die sagen, dass alle Dateien, die mit "1234-567" beginnen verschoben werden sollen. Das geht mit shutil.move nicht. Also mußt Du das Suchen nach den Dateinamen, die dem Muster entsprechen, selbst programmieren. Das geht z.B. mit glob.glob und einer Schleife.

Re: Probleme mit shutil.move ?

Verfasst: Dienstag 20. Januar 2015, 11:13
von BlackJack
@JoB: Oder man filtert sich die Dateinamen mit `startswith()` heraus, dann darf aber der '*' nicht mehr in den Testmustern sein. Das geht auch nur wenn die Muster alle immer den Stern als letztes Zeichen hätten wenn man `glob()` verwenden würde.