Seite 2 von 2

Re: Probleme mit shutil.move ?

Verfasst: Dienstag 20. Januar 2015, 12:02
von JoB
So startswith() wars - jetzt geht's
Hatte ja auch schon MagBen vorgeschlagen

Gracias ...

Re: Probleme mit shutil.move ?

Verfasst: Dienstag 20. Januar 2015, 14:05
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)
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()

Re: Probleme mit shutil.move ?

Verfasst: Dienstag 20. Januar 2015, 14:27
von Hyperion
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.

Re: Probleme mit shutil.move ?

Verfasst: Dienstag 20. Januar 2015, 14:37
von JoB
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

Re: Probleme mit shutil.move ?

Verfasst: Dienstag 20. Januar 2015, 15:33
von Hyperion
Ooops... es muss natürlich ``yield path.strip()`` lauten! (Das ``strip`` hatte Sirius3 angemerkt).

Re: Probleme mit shutil.move ?

Verfasst: Mittwoch 21. Januar 2015, 07:32
von JoB
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

Re: Probleme mit shutil.move ?

Verfasst: Mittwoch 21. Januar 2015, 08:17
von Sirius3
@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()

Re: Probleme mit shutil.move ?

Verfasst: Mittwoch 21. Januar 2015, 08:22
von /me
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.

Re: Probleme mit shutil.move ?

Verfasst: Mittwoch 21. Januar 2015, 09:17
von JoB
Danke, mit eurer Hilfe funktioniert der Murks jetzt :-)