Seite 1 von 1

Namen aus zwei Dateien Vergleichen

Verfasst: Donnerstag 11. Oktober 2012, 17:29
von 01detlef
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

Re: Namen aus zwei Dateien Vergleichen

Verfasst: Donnerstag 11. Oktober 2012, 17:42
von snafu
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.

Re: Namen aus zwei Dateien Vergleichen

Verfasst: Donnerstag 11. Oktober 2012, 17:54
von 01detlef
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?

Re: Namen aus zwei Dateien Vergleichen

Verfasst: Donnerstag 11. Oktober 2012, 18:02
von 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.

Re: Namen aus zwei Dateien Vergleichen

Verfasst: Donnerstag 11. Oktober 2012, 18:26
von 01detlef
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?

Re: Namen aus zwei Dateien Vergleichen

Verfasst: Donnerstag 11. Oktober 2012, 18:34
von EyDu
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.

Re: Namen aus zwei Dateien Vergleichen

Verfasst: Donnerstag 11. Oktober 2012, 20:38
von snafu
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.

Re: Namen aus zwei Dateien Vergleichen

Verfasst: Donnerstag 11. Oktober 2012, 20:50
von 01detlef
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...

Re: Namen aus zwei Dateien Vergleichen

Verfasst: Donnerstag 11. Oktober 2012, 21:37
von 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.