Liste auf Inhalt prüfen

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
Benutzeravatar
OttoPython
User
Beiträge: 47
Registriert: Montag 23. April 2012, 14:14

Moin,

ich brauch mal kreative hilfe. Ich habe mittlerweile Kopfklaus vom vielen Versuchen.

ich erstelle mir per listdir für ein Verzeichnis ein Liste und lasse mir diese Liste dann untereinander geordnet in eine Neue .txt ausgeben.
Da aber auch wenn das Verzeichnis leer ist, eine Datei erzeugt wird und ich diese leeren .txt von hand wieder löschen müsste,
brauche ich nun eine Abfrage um die zuerst erstellte Liste auf Inhalt zu prüfen.

Ich habe schon mehrere Wege versucht aber bekomme es nicht hin.
ich stell mal den Teil rein mit dem ich die Liste und die Dateierzeuge und noch nicht abfrage.Vllt brauch ich einfach nur mal eine andere Idee.

Code: Alles auswählen

pathpol = path
pathpol += "\\Polar"
pol = os.listdir(pathpol)
for file in pol:
	if os.path.isdir(file):
		continue
fobj = open("dir_Polar.txt", "w")
for i in range(len(pol)):
	print >> fobj, pol[i]
fobj.close()
das ist der Code wie er mir immer ausgibt das keine Dateien vorhanden sind obwohl welche im Verzeichnis sind. nehme ich isdir. erstellt python mir immer diese *.txt Datei

Code: Alles auswählen

pathd1s = path
pathd1s += "\\D1SPEC\\"
d1s = os.listdir(pathd1s)

if os.path.isfile(pathd1s):
	print d1s
	for file in d1s:
		continue
	fobj = open("dir_D1SPEC.txt", "w")
	for i in range(len(d1s)):
		print >> fobj, d1s[i]
	fobj.close()
else:
	print "keine Dateien"
gleich noch ne andere Frage. warum sind meine Codes in den Posts nie so bunt wie eure?

beste grüße Otto
Zuletzt geändert von OttoPython am Montag 30. April 2012, 13:11, insgesamt 1-mal geändert.
"Im Burnout steckt viel Arbeit drin" -Lysander
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Du musst deinen Python-Code als solchen markieren, und zwar mit dem »python-« statt dem »Code«-Button bzw. mit dem [ python ]- statt dem [ code ]-Tag.

So kannst du überprüfen, ob eine Liste leer ist:

Code: Alles auswählen

l = []
print 'Liste ist',
if l:
    print 'nicht leer.'
else:
    print 'leer.'
Pfade setzt man übrigens anders zusammen (plattformunabhängig, auch sonst besser):

Code: Alles auswählen

pathpol = os.path.join(path, 'Polar')
Deine erste »for«-Schleife tut bei leeren Listen gar nichts und sonst prüft sie, ob ein Element ein existierender Ordner ist und dann geht es zum nächsten Element. (Tut also auch mehr oder weniger gar nichts.)

Deine zweite »for«-Schleife enthält ein »Antipattern« von Python:

Code: Alles auswählen

for i in range(len(l)):
    # tu was mit l[i]
Wie du es vorher schon getan hast, mit »for file in pol«, so kannst du es auch da machen:

Code: Alles auswählen

for filename in pol:
    # tu was mit filename
BlackJack

@OttoPython: Diese Namen mit `pol` sind nicht gut. Man sollte keine Abkürzungen verwenden, solande die nicht allgemein bekannt sind. Ein Name soll dem Leser die Bedeutung des daran gebundenen Wertes im Programm näherbringen und keine Fragezeichen hinterlassen. Selbst wenn Du statt `pol` so etwas allgemeines wie `filenames` verwendest, macht es das Programm IMHO verständlicher.

Von der speziellen ``>>``-Syntax bei der ``print``-Anweisung würde ich abraten und stattdessen die entsprechenden Methoden auf dem Datei-Objekt verwenden.

Dateien sollte man mit der ``with``-Anweisung öffnen. Dann ist sichergestellt, dass die auch in jedem Fall wieder geschlossen werden.

Die Zuweisung ``pathd1s = path`` erscheint mir überflüssig‽
Benutzeravatar
OttoPython
User
Beiträge: 47
Registriert: Montag 23. April 2012, 14:14

Hallo,

danke für deine schnelle Hilfe. habe das mit der Liste hinbekommen. wirklich sehr viel einfacher und auch tatsächlich nützlich. nicht wie meine versuche.
aber verstehe nicht wie du das meinst als antipattern? funktioniert genau so wie es dann auch soll..

Code: Alles auswählen

pathd1s = os.path.join(path, 'D1SPEC')
d1s = os.listdir(pathd1s)
if d1s:
	fobj = open("dir_D1SPEC.txt", "w")
	for i in range (len(d1s)):
		print >> fobj, d1s[i]
	fobj.close()
"Im Burnout steckt viel Arbeit drin" -Lysander
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Ein "Antipattern" beschreibt eine Formulierung im Quelltext die so der gängigen Konvention für die Programmiersprache wiederspricht.

Was findest du denn einfacher zu lesen und hübscher?

Code: Alles auswählen

>>> namen = ("Karl", "Felix", "Olaf", "Tanja", "Susanne")
>>> for i in range(0, len(namen)):
	print namen[i]

	
Karl
Felix
Olaf
Tanja
Susanne
>>> for name in namen:
	print name

	
Karl
Felix
Olaf
Tanja
Susanne
>>> 
Doch wohl eher die zweite Variante, oder?
Benutzeravatar
OttoPython
User
Beiträge: 47
Registriert: Montag 23. April 2012, 14:14

genau dass tut er bei mir nicht.

Die Liste die er ausgibt sieht dann ungefähr so aus:

['1.txt', '2.txt', '3.txt']
['1.txt', '2.txt', '3.txt']
['1.txt', '2.txt', '3.txt']
"Im Burnout steckt viel Arbeit drin" -Lysander
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Du hast ein Grundproblem, nämlich die Bennenung deiner Variablen.
Die sind so kompliziert benannt, dass du selbst nicht mehr weißt wofür sie stehen.
Im Allgemeinen gilt: verwende "sprechende" Variablen, bei denen du sofort weißt wofür sie stehen. "pathd1s" ist das nicht.

Und deshalb gibst du in deiner Schleife auch die Liste aus über deren Elemente du läufst und nicht die einzelnen Elemente.

Code: Alles auswählen

for namen in name:
 print name
ist nicht:

Code: Alles auswählen

for namen in name:
 print namen
Benutzeravatar
OttoPython
User
Beiträge: 47
Registriert: Montag 23. April 2012, 14:14

danke , jetz hab ich es.

Du hast aber recht dabei, dass die Variablen unübersichtlich scheinen. Es sind in diesem Scrippt aber auch verdammt viele variablen . Nichts desto trotz danke ich dir. Habe jetzt alles Betroffene angepasst.

beste Grüße
Otto
"Im Burnout steckt viel Arbeit drin" -Lysander
BlackJack

@OttoPython: Dann hast Du vielleicht zu viele Namen in einem Namensraum. Wenn ich mal raten müsste hast Du alles als einen grossen Code-Block auf Modulebene und nicht in abgeschlossene, überschaubare Funktionen aufgeteilt!?

Was Du da mit den beiden Verzeichnissen machst schreit doch förmlich nach einer Funktion die den gemeinsamen Code beinhaltet.
Benutzeravatar
OttoPython
User
Beiträge: 47
Registriert: Montag 23. April 2012, 14:14

Ja habe alles als eine großen Block geschrieben.
Bin Mittlerweile auf 345 Zeilen Code..
bin mit Python erst seit wenigen Monaten vertraut. Gibt es einen Weg aus einer Routine eine andere herraus zu starten?
oder dass eine Routine sich andere Routinen herranzieht zum arbeiten?

problem an der ganzen sache ist sowieso folgendes:
Das Scrippt ist gedacht um unzählige gleichstrukturierte HDD auszulesen und einige Inhalte dich ich mir automatisch erstelle per scrippt dann auf ein Server mit wieder gleichbleibender Struktur zu schieben. Is ne ziemlich komplexe sache. Da keine Einzige Datei verschwinden darf.
"Im Burnout steckt viel Arbeit drin" -Lysander
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Du solltest dir mal Funktionen ansehen, denn sie ermöglichen genau das (und noch einiges mehr) wonach du suchst.
problembär

@OttoPython: Diese Namen mit `pol` sind nicht gut.
Dazu auch Loriot, "Der sprechende Hund":
Bello, sach' ma': "Otto Pohl fühlt sich wohl am Pol ohne Atomstrom."
:lol:
Zuletzt geändert von problembär am Montag 30. April 2012, 16:29, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

OttoPython hat geschrieben:Gibt es einen Weg aus einer Routine eine andere herraus zu starten?
oder dass eine Routine sich andere Routinen herranzieht zum arbeiten?
Das ist relativ weit vorne im Tutorial: Defining Functions

Du kannst besser arbeiten, wenn du elementare Sprachkonstrukte von Python kennst. Folgende Analogie kommt mir zu deiner Vorgehensweise in den Sinn:

Du bist dabei mit einem Bohrhammer ein Loch in die Wand zu machen. Hättest du die Anleitung gelesen wüsstest du, dass du deutlich effektiver wärst, wenn du das Kabel hinten an der Maschine in die Steckdose getan hättest.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

/me hat geschrieben: Du bist dabei mit einem Bohrhammer ein Loch in die Wand zu machen. Hättest du die Anleitung gelesen wüsstest du, dass du deutlich effektiver wärst, wenn du das Kabel hinten an der Maschine in die Steckdose getan hättest.
Naja, da gibts wohl bessere Analogien :P

Grüße,
anogayales
Antworten