Probleme mit shutil.move ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
JoB
User
Beiträge: 25
Registriert: Mittwoch 14. Januar 2015, 13:01

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'
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Du musst das '\n' entfernen, probier mal

Code: Alles auswählen

shutil.move(line.strip(), line1.strip())
a fool with a tool is still a fool, www.magben.de, YouTube
JoB
User
Beiträge: 25
Registriert: Mittwoch 14. Januar 2015, 13:01

Vielen Dank MagBen, dass wars ...
Schon länger rumprobiert, deswegen umso größere Freude
JoB
User
Beiträge: 25
Registriert: Mittwoch 14. Januar 2015, 13:01

Lieber moderator,
hol die Pfade zum move aus 2 txt, deswegen ist doch nicht alles falsch?
Zumindest funktioniert es für meine Ansprüche :-)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@JoB: jetzt bricht das Programm halt mit dem zweiten move ab, weil die Datei nicht (mehr) existiert.
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

@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 ;-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
JoB
User
Beiträge: 25
Registriert: Mittwoch 14. Januar 2015, 13:01

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
JoB
User
Beiträge: 25
Registriert: Mittwoch 14. Januar 2015, 13:01

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?
JoB
User
Beiträge: 25
Registriert: Mittwoch 14. Januar 2015, 13:01

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?
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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.
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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()``
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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).
JoB
User
Beiträge: 25
Registriert: Mittwoch 14. Januar 2015, 13:01

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')
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
JoB
User
Beiträge: 25
Registriert: Mittwoch 14. Januar 2015, 13:01

Verstehe ich leider nicht sirius?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
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.
Antworten