Welche Schleife für If-then-else?

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
MoeJo
User
Beiträge: 10
Registriert: Dienstag 16. Dezember 2014, 12:55

Hallo zusammen,

als blutiger Anfänger versuche ich mich an End2End-Checks für verschiedene Dienste.
Für jedes Script soll eine Textdatei mit den Reultaten geschrieben werden. Wenn eine Textdatei mit dem entsprechenden Namen besteht, soll diese erst gelöscht werden und eine neue Datei geschrieben werden.

Nun stehe ich vor dem Problem das ich nicht weiß welche Schleife hierfür genau die richtige wäre und hoffe ihr könnt mir helfen.

Im grunde soll erst geschaut werden, ob eine entsprechende Textdatei besteht und wenn ja, soll diese gelöscht werden. Mein Code lautet wie folgt:

Code: Alles auswählen

myfile="C:/test.txt"
if os.path.isfile(myfile):
        os.remove(myfile)
Mein Code zum schreiben der Textdatei sieht wie folgt aus:

Code: Alles auswählen

try:
    f = open("test.txt", "w")
    try:
        f.write('test test test')
        f.writelines
    finally:
        f.close()
except IOError:
    pass
Nun fehlt mir die Verbindung zwischen den beiden Codes.
In meiner Vorstellung sollte die Schleife wie folgt ablaufen:
If Datei besteht, dann lösche diese und schreibe eine neue Datei, sonst schreibe direkt eine neue Datei.

Ist eine solche Schleife in Python realisierbar oder wie kann ich meine Ansprüche verpacken?

Leider bin ich blutiger Anfänger und ratlos. Ich hoffe Ihr könnt mir helfen.

Viele Grüße
MoeJo
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@MoeJo: was hat Dein Problem mit Schleifen zu tun? Hier soll doch nichts wiederholt werden, das ist nicht einmal ein if-else, weil der zweite Teil, neue Datei schreiben, immer gemacht wird. Also ist das nur eine Aneinanderreihung.

Um Deine Bemühungen vollends zu torpedieren: open mit 'w' erzeugt eine neue Datei oder löscht den Inhalt, falls die Datei schon existiert. Die Abfrage am Anfang ist also überflüssig. PS: Exceptiones sollte man nicht einfach so verschweigen. Das writelines macht nix, weil das nur die Methode referenziert, aber nicht aufruft.
Was bleibt:

Code: Alles auswählen

with open("test.txt", "w") as f:
    f.write('test test test')
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Eine Schleife sehe ich da nicht. Prinzipiell brauchst du doch nur die beiden Codeteile sequenziell ablaufen lassen.

Abgesehen davon ist das Löschen unnötig. mode="w" sorgt doch beim open dafür, dass eine eventuell bestehende Datei geleert und neu beschrieben wird.
MoeJo
User
Beiträge: 10
Registriert: Dienstag 16. Dezember 2014, 12:55

Oh man...

ich danke euch!

Ist es auch möglich der Datei einen Pfad mitzugeben, sodass ich diese beispielsweise direkt auf C://Benutzer/MoeJo/test.txt ablegen kann?

Nochmals vielen Dank und Grüße!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

MoeJo hat geschrieben:Ist es auch möglich der Datei einen Pfad mitzugeben, sodass ich diese beispielsweise direkt auf C://Benutzer/MoeJo/test.txt ablegen kann?
Manche Dinge kann man einfach ausprobieren ;-)
Zuletzt geändert von EyDu am Dienstag 16. Dezember 2014, 14:10, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
BlackJack

@MoeJo: Ja man kann bei `open()` auch komplette Pfade inklusive Dateinamen angeben. Das hättest Du aber auch einfach schnell mal ausprobieren können. :-)
MoeJo
User
Beiträge: 10
Registriert: Dienstag 16. Dezember 2014, 12:55

Oh man²...
wie gesagt, ich bin blutiger Anfänger aber beide Fragen von mir waren :K ...

Trotzdem vielen lieben Dank für eure netten Antworten!
MoeJo
User
Beiträge: 10
Registriert: Dienstag 16. Dezember 2014, 12:55

Nun möchte ich wissen, wie lange es dauert bis mein Test durchgelaufen ist. Die Zeitangabe soll -wie auch meine anderen Werte- in einer Textdatei ausgegeben werden.

Code: Alles auswählen

start = datetime.now()
.
.
.
end = datetime.now()
timediff= end - start

with open("C:/TestResults/test.txt", "w") as f:
    f.write(timediff)

Nun bekomme ich die Fehlermeldung:

TypeError: expected a character buffer object

Hat jemand eine Idee wie ich mir die Dauer des Tests in meiner Textdatei ausgeben lassen kann?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@MoeJo: In eine Datei kannst Du nur Zeichen schreiben, und nicht ein Datum. Du mußt das Datum erst in einen String verwandeln.
MoeJo
User
Beiträge: 10
Registriert: Dienstag 16. Dezember 2014, 12:55

Wow, danke!
Klasse wie hilfsbereit Ihr hier seid!

Muss Euch dann aber nochmals belagern :?

In meiner Ausgabe steht nun nach dem ersten Testdurchlauf als Zeitangabe: 0:00:13.768000

Wie kann ich diese nun auf volle Sekunden bringen? Brauch weder Stunden, Minuten, noch Millisekunden :)

Hoffe, ich nerv nicht...
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@MoeJo: sowas findet man ganz einfach heraus, indem man sich anschaut, welche Methoden timediff bietet.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hier mal eine kleine Session, die Sirius3 Vorschlag demonstriert:

Code: Alles auswählen

In [5]: import datetime

In [6]: t1, t2 = datetime.datetime.now(), datetime.datetime.now()

In [7]: diff = t2 - t1

In [8]: type(diff)
Out[8]: datetime.timedelta

In [9]: dir(diff)
Out[9]: 
[
 ...
 'days',
 'max',
 'microseconds',
 'min',
 'resolution',
 'seconds',
 'total_seconds']

In [10]: diff.seconds
Out[10]: 0

In [11]: diff
Out[11]: datetime.timedelta(0, 0, 26)

In [12]: diff.microseconds
Out[12]: 26
MoeJo
User
Beiträge: 10
Registriert: Dienstag 16. Dezember 2014, 12:55

Hab es jetzt wie folgt gelöst:

Code: Alles auswählen

start-time = datetime.now()
.
.
.
end_time = datetime.now()
timediff = end_time - start_time
str_timediff = str(timediff.seconds)
Grüße Moe
MoeJo
User
Beiträge: 10
Registriert: Dienstag 16. Dezember 2014, 12:55

Mein Script ist nun fast fertig. Das einzige was mir noch fehlt, ist der Logout-Vorgang.
Leider habe ich keine Ahnung wie ich folgenden Logout mit Python abgreifen kann:

Code: Alles auswählen

<a class="has_bottom_tooltip" data-method="delete" data-original-title="Logout" href="/users/sign_out" rel="nofollow" title="Logout"><i class='icon-signout'></i>

Code: Alles auswählen

driver.find_element_by...
stellt keine Lösung dar?!

Ich hoffe, Ihr habt eine Idee und könnt mir auf die Sprünge helfen.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@MoeJo: Programmieren ist nicht, sich wahllos irgendwelche Attribute zu nehmen, die sich richtig anhören, und zu behaupten, dass jetzt alles funktioniert! Man sollte sich zumindest die Dokumentation dazu durchlesen.
Dann kommt man auch auf eine korrekte Lösung:

Code: Alles auswählen

str_timediff = '{:.0g}'.format(timediff.total_seconds())
II. ich würde ja nach einem <a>-Tag mit title "Logout" suchen.
MoeJo
User
Beiträge: 10
Registriert: Dienstag 16. Dezember 2014, 12:55

@ Sirius3
Anhand meiner Ausgabe sehe ich doch ob meine Logik funktioniert?!
Hab bei deiner, als auch bei meiner Lösung das identische Ergebnis in der Ausgabe. Könntest du mir den Unterschied erklären?
Ich würde doch nicht wahllos Behauptungen aufstellen, die nicht zutreffend sind!

zu II:
wie suche ich denn nach dem <a>-Tag?

Mein 1. Versuch war:

Code: Alles auswählen

driver.find_element_by_xpath("//a[@title='Logout']").click()
Leider erfolglos...
MoeJo
User
Beiträge: 10
Registriert: Dienstag 16. Dezember 2014, 12:55

Leider habe ich noch keine Lösung für mein Problem gefunden und schiebe den Thread nochmal nach oben.
Ich hoffe das ist in Ordnung

Liebe Grüße und ein frohes neues Jahr allen zusammen!
MoeJo
BlackJack

@MoeJo: Da der Link ein Attribut mit dem Namen `data-original-title` hat, welches auch den Wert 'Logout' liegt die Vermutung nahe dass das `title`-Attribut von JavaScript-Code verändert wird. Sonst müsste man sich den Originalwert ja nicht noch mal irgendwo anders merken.
MoeJo
User
Beiträge: 10
Registriert: Dienstag 16. Dezember 2014, 12:55

@ BlackJack:
Wie gesagt, meine Stärken liegen nicht in der Programmierung aber ich versuche mein Wissen aufzubessern.
Wenn das title-Attribut verändert wird, ist es doch suboptimal wenn ich nach diesem Attribut suchen lasse oder verstehe ich dich falsch?
Ist es nicht möglich, einfach nach der <i class="....> zu suchen?


Ich schick euch mal anbei den Quellcode:

Code: Alles auswählen

<body class="ui_mars application" data-page="dashboard:show">
<header class="navbar navbar-static-top navbar-lab">
<div class="navbar-inner">
<div class="container">
<ul class="nav">
<li>
<a class="has_bottom_tooltip" title="" rel="nofollow" href="/users/sign_out" data-original-title="Logout" data-method="delete"><i class="icon-signout"></i></a></li>
Wäre superlieb wenn ihr mir den richtigen Wink geben könnt, vorausgesetzt ihr habt einen Ansatz um den "Logout-Button" zu betätigen. Mein komplettes Skript hängt nur noch am Logout :K
Natürlich will ich keine fertige Lösung aber seit 14 Tagen bekomme ich keinen Fuß in die Tür und hab nichtmals mehr einen Ansatz...

Grüße
BlackJack

@MoeJo: Ja nach dem ``<i>``-Element kann man auch suchen und dann ein Element wieder hoch gehen um das ``<a>``-Element zu finden.
Antworten