Namen aus zwei Dateien Vergleichen

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
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Hallo,

ich habe eine kleine Frage zu folgender Sache: Ich möchte mit einem Python-Script gucken, ob Dateinamen innerhalb einer weiteren Datei enthalten sind. Also der Ablauf:
1) Einlesen des Dateinamens (von der ersten Datei)
2) Datei öffnen (Datei liegt in einem anderen Verzeichnis) in der die ganzen Namen stehen
3) Zeilen in der Datei vergleichen mit den Dateinamen

Das ganze habe ich mal probiert, aber es wird nix angezeigt. Also kein Fehler aber auch keine Ausgabe:

Code: Alles auswählen

for infile in glob.glob("Dateinamen")
   fobj = open("Datei_mit_Namen")
   for line in fobj
      if line == infile:
        print "identisch"
   fobj.close()
Ich möchte das so machen, dass der erste Dateiname genommen wird (infile) und dann das File mit den Namen geöffnet wird (fobj) und zeilenweise geprüft wird, ob der Name enthalten ist. Dann das Gleiche mit dem nächsten Dateinamen usw.

MFG
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn du Zeilen aus einer Datei liest, dann bleiben die Zeilenenden erhalten. Wenn hingegen `glob()` etwas zurückliefert, dann sind die Dateinamen ohne Zeilenenden. Mach auf den Dateinnamen, die du zeilenweise einliest, jeweils ein `line.rstrip()`. Damit wird der Whitespace (also: Leerzeichen, Zeilenenden, und Tabulatoren) am linken Ende der Datei entfernt. Das kann man bei Bedarf noch exakter machen, aber für die meisten Belange sollte es ausreichen.
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Hallo,

vielen Dank. Also die Dateinamen sind ja beschränkt, aber die Namen in dem Textfile zum Vergleich haben Leerzeichen an der rechten Seite. Kann dadurch der Vergleich misslingen?
BlackJack

@01detlef: Ja. In dem Fall darfst Du nur das Zeilenende-Zeichen entfernen.

Das Vorgehen ist übrigens sehr ineffizient für jeden Namen immer wieder die ganze Datei zu durchsuchen. Du solltest eine der beiden Mengen in ein `set`-Objekt stecken und dann mit dem ``in``-Operator prüfen ob ein Name aus der anderen Menge enthalten ist.

Oder beide Mengen in `set`-Objekte stecken und dann mit Mengenoperationen die gewünschte Teil- oder Schnittmenge bestimmen.
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Hallo.

hast du dazu ein Beispiel, mir sagt das gar nix. Eine andere Sache ist auch, dass ich die Zeile über dem jeweiligen Dateinamen dann verwenden möchte. Die Dateien sind ein wenig komisch aufgebaut:
Zahl1
Name1
Zahl2
Name2
usw.

Und wenn nun Name1 = Dateiname1, dann möchte ich Zahl1 haben. Wie kann ich dann eine line wieder zurückspringen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Die Anmerkungen von BlackJack setzen alle nur Grundlagenwissen voraus, da musst du also wohl noch etwas nacharbeiten. Da du zu den Namen noch Daten hast, bieten sich in diesem Fall dann Dictionaries statt Mengen an, bzw. eine Kombination von beidem, wenn du keine Mengenoperationen nachbauen möchtest.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Naja, wenn du's hinsichtlich der Zeilenenden genauer haben willst, dann nutze `line.rstrip(os.linesep)`. Alternativ ginge auch `open(filename, 'rbU')` und dann immer ein `line.rstrip('\n')`. Letzteres hätte den Vorteil, dass auch Zeilenenden von fremden Betriebssystemen korrekt behandelt werden. Vielleicht spielt das ja eine Rolle für dich.
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Ich könnte das ganze auch ein wenig vereinfachen, wenn ich wüsste, wie ich zwei Spalten abspeichern kann, also:

Name1 Zahl1
Name2 Zahl2

Ich bekomme es nur hin, dass alles in die erste Spalte der Textdatei kommt. Kann man nicht sagen, dass zwischen Name1 und Zahl1 ein Leerzeichen kommen soll? Ich nutze ganz normal:

Code: Alles auswählen

fout=open("Beispieldatei2.txt","w")
fout.write("Erster String")
fout.close()
Ich kann nirgendswo finden, wie man in eine Textdatei zwei Spalten erstellt...
BlackJack

@01detlef: Wenn da Zeilenenden drin sind, dann müssen die in den Daten enthalten sein, die Du mit `write()` schreibst. Die müssen an der entsprechenden Stelle halt heraus genommen werden vor dem Schreiben, oder vielleicht besser gar nicht erst in die Daten hinein kommen. Bei Deinem Beispiel gibt es ja nicht einmal eine Zeile, beziehungsweise nur eine ohne ein Zeilenende-Zeichen.

Da Dateinamen auch Leerzeichen enthalten dürfen, und im Grunde sogar Zeilenenden (!), würde ich ja ein robusteres Format verwenden. In der Standardbibliothek gibt es zum Beispiel das `csv`-Modul.
Antworten