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

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

So startswith() wars - jetzt geht's
Hatte ja auch schon MagBen vorgeschlagen

Gracias ...
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)
HAbe es leider noch nicht verstanden wie du das meinst:

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"
    
def get_filenames_from(QFile):
    with open(QFile) as f:
        for path in f:
            yield f

def main():
    sources = get_filenames_from(QFile)
    destinations = get_filenames_from(ZFile)
    for source, destination in zip(sources, destinations):
        # shutil.move(source, destination)
        print (source, destination)

main()
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich würde den Code auch mal laufen lassen, dann verstehst Du es vielleicht ;-) (Oder mal in einer *Shell* mit zwei Listen und ``zip`` experimentieren ;-) )

Wieso Du den Parameter in Zeile 15 in ``QFile`` geändert hast, kann ich auch nicht nachvollziehen! ``filename`` ist da doch viel generischer und passender! (Betrifft ja sowohl Quell- als auch Zieldatei)

Bitte unterlasse doch Full-Quotes. Die blähen die Threads auf und helfen nicht beim Verständnis. Und auskommentierte Zeilen lasse doch bitte ebenfalls weg, es sei denn diese dienen dem Verständnis.
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

Verstehe es offensichtlich nicht was du geschrieben hast.

Wenn ich es mit deinen Vorgaben laufen lasse dann kommt das:
TypeError: coercing to Unicode: need string or buffer, file found
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ooops... es muss natürlich ``yield path.strip()`` lauten! (Das ``strip`` hatte Sirius3 angemerkt).
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

Sowohl
yield path.strip()
also auch
yield f.strip()
Führen dazu:
AttributeError: 'file' object has no attribute 'strip'

Code: Alles auswählen

 for path in f:
            for line in f(path.strip(), "r"):
                yield f
Führt dazu:
TypeError: 'file' object is not callable
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@JoB: wo Du auch immer jetzt was, wie ersetzt hast, es gibt nur eine Zeile mit "yield f" und das wird zu:

Code: Alles auswählen

def get_filenames_from(QFile):
    with open(QFile) as f:
        for path in f:
            yield path.strip()
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

JoB hat geschrieben:

Code: Alles auswählen

 for path in f:
            for line in f(path.strip(), "r"):
                yield f
Du solltest schon versuchen zu verstehen was der Code macht. Wenn man einfach nur Code rät und sich nicht wirklich dafür interessiert, dann kommt bei einer Korrektur so ein Murks heraus wie du ihn fabriziert hast.

f ist ein FileObject. Das kann man natürlich nicht mit den Parametern (path.strip(), "r") aufrufen. Was sollte diese Syntax denn auch bedeuten? Und wie kommst du auf die Idee innerhalb einer Schleife die über die Zeilen des Dateiobjekts iteriert noch einmal eine Schleife über das gleiche Dateiobjekt konstruieren zu wollen?

Fehlerhaft im Beispielcode war, wie auch schon explizit geschrieben wurde, das yield f. Dadurch würde ja für jede durchlaufene Zeile der Datei das Dateiobjekt selber zurückgegeben. Gewünscht ist aber path. Um den jetzt noch vorne und hinten von Leerzeichen und Zeilenumbrüchen zu befreien wendet man darauf die strip-Methode an.

Code: Alles auswählen

for path in f:
    yield path.strip()

Falls du ein Problem mit yield hast, dann schau dir mal das folgende Beispiel an.

Code: Alles auswählen

def get_values():
    yield 2
    yield 3
    yield 5
    yield 8

for result in get_values():
    print(result)
Die Schleife ruft der Reihe nach die Werte aus get_values ab. Der Code in get_values läuft dabei immer nur bis zum nächsten yield und wartet dort auf den nächsten Abruf. Das unterscheidet sich massiv von return. return verlässt an der Stelle die Funktion und kommt auch nicht zurück.

Jetzt erzeugen wir das mehrfache yield durch eine Schleife.

Code: Alles auswählen

def get_squares(iterable):
    for value in iterable:
        yield value ** 2

numbers = range(10)
for result in get_squares(numbers):
    print(result)
Der Code erstellt ein iterierbares Objekt mit den Zahlen von 0-9 und übergibt das an square_numbers. square_numbers durchläuft jetzt den Code bis zum yield und wartet dann darauf, dass der Wert abgerufen wird. Das passiert, genau wie im ersten Beispiel, durch die äußere Schleife (for result in get_squares). Nach jedem Abruf läuft dann das Programm die Schleife innerhalb von get_squares weiter bis zum nächsten yield - oder bis das Iterable durchlaufen wurde und kein Wert mehr kommt.
JoB
User
Beiträge: 25
Registriert: Mittwoch 14. Januar 2015, 13:01

Danke, mit eurer Hilfe funktioniert der Murks jetzt :-)
Antworten