Problem mit Shutil

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.
Antworten
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Hallo nochmal ,

Ich sitze seit Stunden an einem kleinen Problem und finde leider keine Lösung es geht eigentlich um einen ganz kleinen Code simples Kopieren von Dateien.


Code: Alles auswählen


source = r'C:\Users\Marcel\Desktop\test1\test1.txt'
metadata = os.stat(source)
print(metadata)
destination = r'C:\Users\Marcel\Desktop\test3'
dest1 = shutil.copy2(source, destination)
metadata = os.stat(dest1)
print(metadata)

Ich habe sämtliche Methoden mit Shutil ausprobiert leider klappt es bei mir nicht so wie bei anderen Leuten. Das Problem ist das am Ende ( es ist auch egal wie Ich es mache als Pathobjekt oder string .... ) die Dateien sind am Ende nicht gleich und hier weiß Ich leider nicht mehr weiter. Wenn Ich die Dateien am Ende mit samefile ( von Pathlib) prüfe sind diese nicht gleich ( False), wenn Ich die Dateien mit filecmp prüfe sind Sie gleich ??? ... Wenn Ich mir mit OS.State die Daten anzeigen lassen sind diese unterschiedlich aber Ich verstehe nicht warum . Beispiel Text vom oberen Code:

Code: Alles auswählen

os.stat_result(st_mode=33206, st_ino=4503599628219475, st_dev=1793696924, st_nlink=1, st_uid=0, st_gid=0, st_size=10, st_atime=1628309701, st_mtime=1628309701, st_ctime=1628309691)
After copying file
os.stat_result(st_mode=33206, st_ino=9007199255404876, st_dev=1793696924, st_nlink=1, st_uid=0, st_gid=0, st_size=10, st_atime=1628309701, st_mtime=1628309701, st_ctime=1628318183)
C:\Users\Marcel\Desktop\test3\test1.txt
Wenn Ich mich richtig informiert habe werden bei pathlib -> samefile st_info und st_dev beider Dateien verglichen .... aber wieso sind diese unterschiedlich ???

Ich danke euch
Eine Vision ohne Aktion bleibe eine Illusion
nezzcarth
User
Beiträge: 1753
Registriert: Samstag 16. April 2011, 12:47

Die Dateien werden dir nach meinem Verständnis als unterschiedlich angezeigt, weil es sich eben um zwei verschiedene Dateien handelt. Ich weiß nicht genau, wie NTFS (oder was auch immer heute bei Windows zum Einsatz kommt) intern funktioniert. Unix-Datei-Systeme basieren auf dem Konzept von Inodes. Und das Feld, in dem sich in deinem Beispiel die Dateien unterscheiden, ist genau das Feld der Inode-Nummer. D.h. du bekommst die Dateien aufgrund deiner Vergleichsmethode als verschiedenen angezeigt; verschiedene Dateien haben (wenn sie keine Hardlinks sind) eben verschiedene Inode-Nummern. Wenn du die Dateien vergleichen möchtest, bilde einen Hash über den Inhalt. Wenn du zusätzlich die Metadaten vergleichen möchtest, musst du zumindest die Inode-Nummer ausklammern.

'stat' kenne ich auch eigentlich erst einmal nur als Unix-Syscall. Die Werte die du da siehst, werden also durch irgendeine Kompabilitätsschicht bereit gestellt (ich weiß nicht genau, wie das intern in Python gelöst ist).
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich denke mal hier ist das Konzept von Gleichheit vs Identität relevant. Umgangssprachlich auch “das gleiche” vs “das selbe”.

Du kannst zwei Autos haben die gleich sind - Modell, Farbe, Alter, Beulen. Aber wenn du das selbe Auto wie dein Bruder fährst, dann teilt ihr euch eines.

Und issame fragt nach demselben. Weil Pfade auf unterschiedliche Weise auf die selbe Datei zeigen können. Und dafür muss dann auch noch nicht mal der Inhalt geprüft werden.

Du willst aber Gleichheit. Dazu musst du einfach einlesen und == benutzen.
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

gelöscht
Eine Vision ohne Aktion bleibe eine Illusion
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

hmmmm also verzeih mir @__deets__ aber leider bin Ich ein spät Zünder...

Ich versuche das mal für mich zusammenzufassen bzw Ich versuche zu erklären wieso Ich es nicht ganz verstehe:

Ich habe eine Kopie einer Datei erzeugt die dann einfach in einen anderen Ordner geschoben wurde....Bei Python zeigen doch auch mehrere gleiche zum Beispiel Variablen auf die gleiche Speicheradresse deswegen verstehe Ich nicht das nicht.


Die Pfade zu vergleichen macht keinen Sinn ergo bringt mich dein Tipp nur auf die Idee etwas anderes zu vergleichen wie die größe der Datei sonst stehe Ich da leider auf dem Bahnhof. Desweiteren Verstehe Ich nicht ob Ich etwas falsch mache ... Ich habe bei anderen gesehen das die st_ino bei anderen gleich geblieben ist.... Und was Ich auch nicht verstehe Ich habe jedoch noch nie damit gearbeitet .... Man kann mit filecmp anscheinend ebenfalls Dateien vergleichen :

Code: Alles auswählen

import shutil
import filecmp
from pathlib import Path
from shutil import copyfile, copy, copy2, copyfileobj
from time import sleep
import os

f1 = Path(r'C:\Users\Marcel\Desktop\versuch\test1\test1.txt')
f2 = Path(r'C:\Users\Marcel\Desktop\versuch1\test3\test1.txt')

# shutil.copy2(source, destination)

s1=Path(f1).stat()
s2=Path(f2).stat()

print(s1)
print(s2)

comp = filecmp.cmp(f1, f2,shallow=True)
comp1 = filecmp.cmp(f1, f2, shallow=False)

print(comp)
print(comp1)


Und wenn Ich das mache bekomme Ich bei Comp und Comp1 jeweils ein True zurück .... Ich hoffe du kannst mich noch einen kleinen Tipp geben Ich danke dir


Also wenn Ich jetzt richtig Verstanden habe sind es trotz der Kopie zwei unterschiedliche Dateien mit dem gleiche Inhalt. Deswegen Funktioniert der Vergleich nicht richtig ?
Eine Vision ohne Aktion bleibe eine Illusion
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bl3nder: Du hast eine Kopie der Datei erzeugt in dem die Quelldatei geöffnet wurde, eine Zieldatei geöffnet/neu erstellt wurde, und dann der Dateiinhalt von der Quelldatei gelesen und in die Zieldatei geschrieben wurde. Und am Ende wurden Metadaten wie Zugriffsrechte und Zeitangaben bei der Zieldatei noch wie bei der Quelldatei gesetzt — weil `copy2()` statt `copy()`. Danach hast Du zwei Dateien, die unabhängig voneinander sind, mit gleichem Inhalt. Wenn Du den Inhalt einer der beiden Dateien änderst, hast Du zwei Dateien mit unterschiedlichem Inhalt.

Man kann aber auch einen Hardlink auf eine Datei erstellen. Nicht unter jedem Dateisystem, das kommt ursprünglich aus der Unix-Welt. Und dann hast Du nur *eine* Datei, die aber über mehrere Pfade erreichbar ist. Das heisst wenn man den Dateiinhalt über den einen Pfad ändert, dann sieht man diese Änderung wenn man die Datei über den anderen Pfad ausliest. Die Daten liegen auch nur einmal auf dem Datenträger. So eine Situation erreicht man mit `os.link()`. Und wie gesagt, nur auf Dateisystemen, die diese Eigenschaft unterstützen.

`samefile()` prüft ob es sich um die *selbe* Datei handelt. Wenn das `True` liefert, dann gibt es nur eine Datei, die unter beiden Namen erreichbar ist. Da es nur eine Datei gibt, ist der Inhalt hinter den beiden Pfaden natürlich gleich, dass heisst wenn `samefile()` wahr ist, dann ist automatisch auch `filecmp.cmp()` wahr.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, es sind zwei unterschiedliche Dateien. Wenn du eine Datei auf einen USB-Stick kopierst, und den auf den Mond schiesst, hast du dann auf deiner Festplatte dieselbe Datei? Wohl nicht, oder? Aber solange du die nicht anfasst, sind sie doch *gleich*.

Deine Beobachtung zu Python ist *falsch*. Zwei gleiche Objekte zeigen NICHT zwingend auf die gleiche Speicheradresse. Deswegen sind sie *GLEICH*, und nicht *IDENTISCH*.

Code: Alles auswählen

l1 = [1, 2, 3]
l2 = [1, 2, 3]
print(l1 == l2) # wahr, weil gleicher Inhalt
print(l1 is l2) # falsch, weil andere Speicheradresse
l3 = l2
print(l2 is l3) # gleich, weil zwei Namen auf *dasselbe* (NICHT DAS GLEICHE!!!!!!) Objekt zeigen
Und deine Vergleiche stimmen doch. Du solltest nicht shallow=True nehmen, weil das nur Attribute und nicht den Inhalt vergleicht. Warum denkst du, die sind falsch?
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Ich danke euch für das ganze Feedback :)
Eine Vision ohne Aktion bleibe eine Illusion
Antworten