Hallo,
soweit hab ich es: Ich hole mir eine Liste mit Links, die einzeln untereinander stehen und schreibe diese in meine links.txt
jetzt möchte ich, wenn ich das zweite Mal die Liste anfordere, dass er links die noch nicht in der liste stehen anfügt und links die nicht mehr in der Liste stehen mit einem Zusatz nicht_in_liste oder ähnlichem versieht. :K
Ich hoffe die Darstellung des Problems ist klar und ich hoffe mir kann jemand von euch helfen.
Vielen Dank schon mal, dass ihr euch die Zeit genommen habt meinen Beitrag bis zum Ende zu lesen
Gruß
Zwei Listen vergleichen
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Hallo und willkommen im Forum!
Ich denke du suchst `set`s.
Ich denke du suchst `set`s.
Code: Alles auswählen
>>> old = [1,2,3,4]
>>> new = [3,4,5,6]
>>> a = set(old)
>>> b = set(new)
>>> a - b
set([1, 2])
>>> b - a
set([5, 6])
>>> a.update(b)
>>> a
set([1, 2, 3, 4, 5, 6])
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
- User
- Beiträge: 81
- Registriert: Samstag 14. August 2010, 22:20
Hallo, danke für deine Antwort. Ich hab das jetzt mal so versucht:
Ich hoffe ihr könnt mit meinen momentan etwas wirren Gedankengängen etwas anfangen
Gruß
edit: Hab noch etwas gegoogelt und ich denke ich brauche exakt sowas:
Code: Alles auswählen
neueListe = set(f_temp)
alteListe = set(f_links)
fehlendeUrls = alteListe - neueListe #Da ist schon das erste Problem, weil er die Links die neu dazugekommen sind ja auch als fehlendeUrls speichern würde
alteListe = neueListe - fehlendeUrls
f_links.write(str(alteListe)) # ginge das so mit str weil ohne sagt er mir "argument 1 must be string or read-only character buffer, not set" aber mit str kommt zwar kein error aber in der txt datei steht nur set([])
Gruß
edit: Hab noch etwas gegoogelt und ich denke ich brauche exakt sowas:
Nur eben nicht für Verzeichnisse sondern für den Inhalt von Dateien.cmpfiles( dir1, dir2, common[, shallow])
Returns three lists of file names: match, mismatch, errors. match contains the list of files match in both directories, mismatch includes the names of those that don't, and errros lists the names of files which could not be compared. Files may be listed in errors because the user may lack permission to read them or many other reasons, but always that the comparison could not be done for some reason.
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
Code: Alles auswählen
neueListe = set(f_temp)
alteListe = set(f_links)
alt_und_neu = alteListe & neueListe
alt_aber_nicht_neu = alteListe - neueListe
neu_aber_nicht_alt = neueListe - alteListe
Du willst file.writelines():
Code: Alles auswählen
some_set = set()
... # some_set befüllen
some_file.writelines(some_set)
In specifications, Murphy's Law supersedes Ohm's.
-
- User
- Beiträge: 81
- Registriert: Samstag 14. August 2010, 22:20
Hallo,
danke für die hilfe. Nur jetzt bekomme ich einen komischen error:
Edit, habe es Selbst gelöst. Man muss die Dateien mit r+w öffnen nicht mit rw
edit 2:
So hab ichs allerdings sind alt_aber_nicht_neu Irgendwelche links die auf jeden fall sowohl in der alten als auch in der neuen liste vorkommen.
danke für die hilfe. Nur jetzt bekomme ich einen komischen error:
Code: Alles auswählen
neueListe = set(f_temp)
IOError: [Errno 9] Bad file descriptor
edit 2:
Code: Alles auswählen
ulLinks = resp.read()
f_temp.write(ulLinks)
neueListe = set(f_temp)
alteListe = set(f_links)
alt_und_neu = alteListe & neueListe
alt_aber_nicht_neu = alteListe - neueListe
neu_aber_nicht_alt = neueListe - alteListe
print alt_aber_nicht_neu
f_links.close()
f_links = open('links.txt','w+r')
f_links.write(ulLinks)
f_links.close()
f_temp.close()
f_down.close()
Zuletzt geändert von Herr Lehmann am Sonntag 15. August 2010, 10:35, insgesamt 1-mal geändert.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Der Fehler kommt wirklich exakt durch die Zeile, die Du da gepostest hast? Wa sist denn f_temp für ein Typ? Evtl. ein File-Object? Evtl. eines, welches bereits wieder geschlossen wurde?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
-
- User
- Beiträge: 81
- Registriert: Samstag 14. August 2010, 22:20
Wie gesagt, den Error konnte ich selbst beheben, aber das vergleichen mit sets scheint nicht richtig zu funktionieren
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Abgesehen davon, dass der Code ziemlich wirr aussieht, vergleichst Du da File-Objekte und nicht den Inhalt der Dateien!
Schreib Dir doch dazu Funktionen und gliedere die auf:
- eine Funktion zum Einlesen beliebiger Dateien, die eine Liste (oder eben gleich ein Set) von den Links zurückliefert
- dann rufst Du die eben mit den beiden betroffenen Dateien auf und führst die oben geschilderten Mengenoperationen auf den Rückgabewerten aus
Schreib Dir doch dazu Funktionen und gliedere die auf:
- eine Funktion zum Einlesen beliebiger Dateien, die eine Liste (oder eben gleich ein Set) von den Links zurückliefert
- dann rufst Du die eben mit den beiden betroffenen Dateien auf und führst die oben geschilderten Mengenoperationen auf den Rückgabewerten aus
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
-
- User
- Beiträge: 81
- Registriert: Samstag 14. August 2010, 22:20
Könntest das konkretisieren, habe leider noch nicht soviel Erfahrung in Pythoneine Funktion zum Einlesen beliebiger Dateien, die eine Liste (oder eben gleich ein Set) von den Links zurückliefert
@Herr Lehmann: In der Python-Dokumentation gibt es ein Tutorial, welches man mal durchgearbeitet haben sollte.
Und dann kannst Du auch mal ``print`` verwenden um Annahmen zu überprüfen. Lass Dir zum Beispiel nach ``neueListe = set(f_temp)`` mal `neueListe` ausgeben und vergleiche was Du bekommst, mit dem was Du wohl erwartet hast.
Und dann kannst Du auch mal ``print`` verwenden um Annahmen zu überprüfen. Lass Dir zum Beispiel nach ``neueListe = set(f_temp)`` mal `neueListe` ausgeben und vergleiche was Du bekommst, mit dem was Du wohl erwartet hast.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Z.B. so:
Zum Speichern kannst Du dann ggf. auch eine solche Funktion schreiben.
Generell stellen sich mir noch die Fragen:
Wieso eigentlich gibt es mehr als "eine" Datei? Wenn Du doch so etwas wie einen Crawler hast, könntest Du doch direkt gegen die zuvor persistenten daten vergleichen. Wozu der Umweg über das Speichern der Daten in eine neue Datei?
Code: Alles auswählen
def load(filename):
with open(filename, "r") as infile:
return infile.read()
def main():
old_links = set(load("old_links.txt"))
new_links = set(load("old_links.txt"))
# ab hier kannst Du dann die Vergleiche durchführen
Generell stellen sich mir noch die Fragen:
Wieso eigentlich gibt es mehr als "eine" Datei? Wenn Du doch so etwas wie einen Crawler hast, könntest Du doch direkt gegen die zuvor persistenten daten vergleichen. Wozu der Umweg über das Speichern der Daten in eine neue Datei?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
-
- User
- Beiträge: 81
- Registriert: Samstag 14. August 2010, 22:20
Genau das ist mir gerade auch aufgefallen... Ich bastel mal noch ein bißchen rum, vielen Dank für die Denkanstöße.Generell stellen sich mir noch die Fragen:
Wieso eigentlich gibt es mehr als "eine" Datei? Wenn Du doch so etwas wie einen Crawler hast, könntest Du doch direkt gegen die zuvor persistenten daten vergleichen. Wozu der Umweg über das Speichern der Daten in eine neue Datei?
Z.B. so:Generell stellen sich mir noch die Fragen:
Wieso eigentlich gibt es mehr als "eine" Datei? Wenn Du doch so etwas wie einen Crawler hast, könntest Du doch direkt gegen die zuvor persistenten daten vergleichen. Wozu der Umweg über das Speichern der Daten in eine neue Datei?
Gruß
P.S. Ich bin von Python wirklich begeistert nur irgendwie vermisse ich sowas wie die Java API wo ich nachlesen kann, welche Mehtoden mit welchen Parameter aufgerufen werden können.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
http://docs.python.org/Herr Lehmann hat geschrieben: P.S. Ich bin von Python wirklich begeistert nur irgendwie vermisse ich sowas wie die Java API wo ich nachlesen kann, welche Mehtoden mit welchen Parameter aufgerufen werden können.
Ich hoffe die Seite kanntest Du?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
-
- User
- Beiträge: 81
- Registriert: Samstag 14. August 2010, 22:20
Ja danke nochmal für den Hinweis.. habe nicht genau genug geguckt.
Zu meinem Prblem, wenn ich es so mache wie du vorschlägst:
old_links = set(load("old_links.txt"))
dann bekomme ich bei einem print old_links : set(['\n', '-', '/', '.', '1', '0', '3', '2', '5', '4', '7', '6', '9', '8', ':', 'A', 'C', 'B', 'E', 'D', 'G', 'F', 'I', 'H', 'K', 'J', 'M', 'L', 'O', 'N', 'P', 'S', 'R', 'U', 'T', 'W', 'V', 'Z', '_', 'a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h', 'k', 'j', 'm', 'l', 'o', 'n', 'q', 'p', 's', 'r', 'u', 't', 'w', 'v', 'y', 'x', 'z'])
Das kann doch so nicht richtig sein.
Zu meinem Prblem, wenn ich es so mache wie du vorschlägst:
old_links = set(load("old_links.txt"))
dann bekomme ich bei einem print old_links : set(['\n', '-', '/', '.', '1', '0', '3', '2', '5', '4', '7', '6', '9', '8', ':', 'A', 'C', 'B', 'E', 'D', 'G', 'F', 'I', 'H', 'K', 'J', 'M', 'L', 'O', 'N', 'P', 'S', 'R', 'U', 'T', 'W', 'V', 'Z', '_', 'a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h', 'k', 'j', 'm', 'l', 'o', 'n', 'q', 'p', 's', 'r', 'u', 't', 'w', 'v', 'y', 'x', 'z'])
Das kann doch so nicht richtig sein.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Stimmt. Du müßtest die "readlines()"-Methode auf dem File-Objekt nehmen - sofern Dein Dateiformat aus einem Link in genau einer Zeile besteht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
-
- User
- Beiträge: 81
- Registriert: Samstag 14. August 2010, 22:20
Jetzt gehts, vielen vielen Dank!!!