Hi Leute,
hatte nicht verstanden was die Einrückung ist. Jetzt gelesen und verstanden.
Mein erste Problem ist gelöst.
Danke nochmals für die Hinweise.
Ich komme sicher mit neue Frage.
Danke nochmal.
Pythonskript bei ControlDesk NG Ausführen
@mariane: ja, das geht. Du mußt aber eine passende Parametrisierung finden, um die Funktion übersichtlich zu halten. Mehr als 30 Zeilen sollte nämlich so eine Funktion nicht haben. Du wirst dafür wahrscheinlich Dictionaries brauchen.
Hey,
wer sieht Fehler?
wer sieht Fehler?
Code: Alles auswählen
datei = "D:\Miriane KM\Test_Digitalkarten dig_in_highbits\CDNG5_1\Project_001\test_dig\Value.csv"
obj = open(datei,"r")
Traceback (most recent call last):
File "D:\Miriane KM\Test_Digitalkarten dig_in_highbits\CDNG5_1\Project_001\test_dig\Python Scripts\testlayout_01.py", line 25, in <module>
obj = open(datei,"r")
IOError: [Errno 22] invalid mode ('r') or filename: 'D:\\Miriane KM\\Test_Digitalkarten dig_in_highbits\\CDNG5_1\\Project_001\test_dig\\Value.csv'
Zuletzt geändert von Hyperion am Dienstag 12. August 2014, 12:33, insgesamt 1-mal geändert.
Grund: Code in Python-Code Tags gesetzt.
Grund: Code in Python-Code Tags gesetzt.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Bitte setze Code, den Du hier postest, in die dafür vorgesehenen Tags! Das ist Dir jetzt schon mehrfach gesagt worden; so schwer kann das doch nicht sein, oder?
Direkt über Dem Eingabefeld befinden sich lauter Buttons, angefangen mit "B" (für Bold), "i", "u" usw. An 5. Stelle eben "Code" mit der Auswahlbox, für welche Sprache der sein soll. Per Default ist da Python ausgewählt. Du musst also nichts weiter machen, als da drauf zu drücken und dann Deinen Code *zwischen* die Tags zu schreiben.
z.B. so (hier mit Leerzeichen in den Tags, damit die Forumsoftware die Tags nicht erkennt und Du sie hier siehst):
[ code=python file=Untitled.py ]
def foo():
print("bin in foo")
[ /Code ]
Und so sieht das dann später aus:
Direkt über Dem Eingabefeld befinden sich lauter Buttons, angefangen mit "B" (für Bold), "i", "u" usw. An 5. Stelle eben "Code" mit der Auswahlbox, für welche Sprache der sein soll. Per Default ist da Python ausgewählt. Du musst also nichts weiter machen, als da drauf zu drücken und dann Deinen Code *zwischen* die Tags zu schreiben.
z.B. so (hier mit Leerzeichen in den Tags, damit die Forumsoftware die Tags nicht erkennt und Du sie hier siehst):
[ code=python file=Untitled.py ]
def foo():
print("bin in foo")
[ /Code ]
Und so sieht das dann später aus:
Code: Alles auswählen
def foo():
print("bin in foo")
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
"\t" im Code wird zu einem einzelnen Zeichen im resultierenden String und nicht zu den zwei Zeichen "\" und "t". Siehe dazu auch das Kapitel zu Strings im Tutorial. Welche speziellen Zeichen es gibt findest du bei der Beschreibung der Literale in der Tabelle mit den Escape Sequences.miriane hat geschrieben:wer sieht Fehler?
Du musst hier also entweder den Backslash escapen oder einen Raw-String verwenden.
@miriane: Nein tust Du nicht. In dem tatsächlichen Pfad stehen irgendwie die *zwei* Zeichen ``\`` und ``t``, und da schreibst Du *ein* Zeichen, nämlich das Tabulatorzeichen, dessen Escape-Sequenz '\t' lauten:
Code: Alles auswählen
In [27]: len('a\tb')
Out[27]: 3
In [28]: print 'a\tb'
a b
In [29]: len('a\\tb')
Out[29]: 4
In [30]: len(r'a\tb')
Out[30]: 4
In [31]: print 'a\\tb'
a\tb
In [32]: print r'a\tb'
a\tb
habe das gefunden, aber es klappt auch leider nicht:
Code: Alles auswählen
accepted \t is a tab character.
Use a raw string instead:
test_file=open(r'c:\Python27\test.txt','r')or double the slashes:
test_file=open('c:\\Python27\\test.txt','r')or use forward slashes instead:
test_file=open('c:/Python27/test.txt','r')
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Und was genau bedeutet "klappt" nicht? :K
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
Hi,
wie kann ich in diesen Code meine Datei weiter verwenden? Mit der erste Funktion wird eine Csv.datei in browser ausgewählt und ich will diese datei in den zweiten Funktion öfnen und verwenden.
wie kann ich in diesen Code meine Datei weiter verwenden? Mit der erste Funktion wird eine Csv.datei in browser ausgewählt und ich will diese datei in den zweiten Funktion öfnen und verwenden.
Code: Alles auswählen
import os
import string
# Csv.datei per PushButton auswaehlen
def On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked(sender, button):
"""
Syntax : On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked
Purpose:
Parameters: sender, button
"""
sender= str(sender)
import win32ui,win32con,sys
fd = win32ui.CreateFileDialog(1,'','', 0,'Csv |*.csv')
fd.SetOFNTitle("Select CSV File")
if fd.DoModal() == win32con.IDCANCEL: sys.exit(1)
print fd.GetPathName().replace('\\','/')
a=fd.GetPathName().replace('\\','/')
return a
#print "On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked "
#Skript ausfuehren,
def On_Application_LayoutManagement_testlayout_01_Push0020Button_67_ButtonClicked(sender, button):
"""
Syntax : On_Application_LayoutManagement_testlayout_01_Push0020Button_67_ButtonClicked
Purpose:
Parameters: sender, button
"""
sender= str(sender)
datei=a
namen = []
zahlenwerte = []
liste = []
liste1.append('Timestep')
index1 = liste1.index('Timestep')
obj = open(datei,'r+')
Hat sich erledigt, globale variable
global a.
Nächste Problem.Wenn ich keine datei auswähle und beim Klick auf abbrechen become ich auch einen Fehler.
Python error:
Traceback (most recent call last):
File "<Experiment Context>", line 15, in On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked
SystemExit: 1
global a.
Nächste Problem.Wenn ich keine datei auswähle und beim Klick auf abbrechen become ich auch einen Fehler.
Python error:
Traceback (most recent call last):
File "<Experiment Context>", line 15, in On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked
SystemExit: 1
Code: Alles auswählen
import os
import string
# Csv.datei per PushButton auswaehlen
def On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked(sender, button):
"""
Syntax : On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked
Purpose:
Parameters: sender, button
"""
sender= str(sender)
import win32ui,win32con,sys
fd = win32ui.CreateFileDialog(1,'','', 0,'Csv |*.csv')
fd.SetOFNTitle("Select CSV File")
if fd.DoModal() == win32con.IDCANCEL: sys.exit(1)
print fd.GetPathName().replace('\\','/')
global a
a=fd.GetPathName().replace('\\','/')
return a
@miriane: Um Himmels willen *NEIN*! Vergiss bitte das es ``global`` überhaupt gibt. Das ist keine Lösung und total unsinnig wenn die Funktion den gewünschten Wert doch sowieso schon zurück gibt.
Die zweite Funktion muss die erste Funktion aufrufen. Der Pfad zu der Datei wird von der ersten Funktion ja zurückgegeben.
Die ”Dokumentation” bei den beiden Funktionen ist übrigens nicht so toll. Wie eine Funktion heisst hat nichts mit Syntax zu tun und braucht auch im Docstring nicht noch einmal wiederholt werden. Der Funktionsname steht doch genau da drüber, da kann man ihn auch lesen. Das was Du als Kommentar vor die Funktionen geschrieben hast, gehört in den Docstring. Und die Parameter einfach nur aufzuzählen ist im Grunde genau so unsinnig wie den Funktionamen noch mal in den Docstring zu schreiben solange da nicht eine weitere Erklärung zu den einzelnen Parametern steht, denn *dass* es sie gibt und wie sie heissen sieht man auch ohne die Aufzählung im Docstring. Da die beiden überhaupt nicht verwendet werden, könnte man das Dokumentieren auch einfach sein lassen, und Defaultwerte angeben, so dass man die Funktion auch ohne Argumente aufrufen kann. Dafür könnte man aber den Rückgabewert dokumentieren.
Der Funktionsname ist grauenvoll.
Importe gehören eigentlich an den Anfang des Moduls, damit man leichter sieht wovon ein Modul abhängig ist.
Abkürzungen bei Namen sollte man vermeiden. Hier ist zum Beispiel das `fd` sehr ungünstig, nicht nur weil man an dem Namen nicht erkennen kann was das Objekt im Programm bedeutet, sondern weil ein guter Teil von Programmierern hier sogar irregeführt wird, denn `fd` ist eine gängige Abkürzung für „file descriptor” in anderen Quelltexten. `a` ist auch nicht besser, auch wenn hier keine Verwechslungsgefahr besteht. Der Name ist aber auch überflüssig weil es nicht sinnvoll ist etwas an einen Namen zu binden, nur um den gleich in der nächsten Anweisung mit einem ``return`` zu verwenden.
Bei der Formatierung weicht der Quelltext stellenweise vom Style Guide for Python Code ab.
Die Ausnahme beim Abbrechen erzeugst Du ja selbst mit dem `sys.exit()`-Aufruf. Ist auch eher ungewöhnlich das man in einem Dateidialog auf Abbrechen drückt und damit den gesamten Prozess beenden will.
Die zweite Funktion muss die erste Funktion aufrufen. Der Pfad zu der Datei wird von der ersten Funktion ja zurückgegeben.
Die ”Dokumentation” bei den beiden Funktionen ist übrigens nicht so toll. Wie eine Funktion heisst hat nichts mit Syntax zu tun und braucht auch im Docstring nicht noch einmal wiederholt werden. Der Funktionsname steht doch genau da drüber, da kann man ihn auch lesen. Das was Du als Kommentar vor die Funktionen geschrieben hast, gehört in den Docstring. Und die Parameter einfach nur aufzuzählen ist im Grunde genau so unsinnig wie den Funktionamen noch mal in den Docstring zu schreiben solange da nicht eine weitere Erklärung zu den einzelnen Parametern steht, denn *dass* es sie gibt und wie sie heissen sieht man auch ohne die Aufzählung im Docstring. Da die beiden überhaupt nicht verwendet werden, könnte man das Dokumentieren auch einfach sein lassen, und Defaultwerte angeben, so dass man die Funktion auch ohne Argumente aufrufen kann. Dafür könnte man aber den Rückgabewert dokumentieren.
Der Funktionsname ist grauenvoll.
Importe gehören eigentlich an den Anfang des Moduls, damit man leichter sieht wovon ein Modul abhängig ist.
Abkürzungen bei Namen sollte man vermeiden. Hier ist zum Beispiel das `fd` sehr ungünstig, nicht nur weil man an dem Namen nicht erkennen kann was das Objekt im Programm bedeutet, sondern weil ein guter Teil von Programmierern hier sogar irregeführt wird, denn `fd` ist eine gängige Abkürzung für „file descriptor” in anderen Quelltexten. `a` ist auch nicht besser, auch wenn hier keine Verwechslungsgefahr besteht. Der Name ist aber auch überflüssig weil es nicht sinnvoll ist etwas an einen Namen zu binden, nur um den gleich in der nächsten Anweisung mit einem ``return`` zu verwenden.
Bei der Formatierung weicht der Quelltext stellenweise vom Style Guide for Python Code ab.
Code: Alles auswählen
def ask_for_csv_filename(_sender=None, _button=None):
"""Öffnet einen Dateidialog und lässt den Benutzer einen CSV-Dateinamen
auswählen, der dann zurückgegeben wird.
"""
dialog = win32ui.CreateFileDialog(1, flags=0, filter='Csv |*.csv')
dialog.SetOFNTitle('Select CSV File')
if dialog.DoModal() == win32con.IDCANCEL:
sys.exit(1)
return dialog.GetPathName().replace('\\', '/')
Von dieser Code habe auch ein Hinweis bekommen und suche nach einer anderen variante
einen Hinweis muss ich Ihnen aber geben:
Sie verwenden in Ihrem Skript (nur beim Betätigen des Cancel-Buttons)
"sys.exit(1) "
Diese Funktion bitte auf keinen Fall verwenden, damit wird der gesamte Python Interpreter beendet.
Hat bitte jemand etwas anders?
einen Hinweis muss ich Ihnen aber geben:
Sie verwenden in Ihrem Skript (nur beim Betätigen des Cancel-Buttons)
"sys.exit(1) "
Diese Funktion bitte auf keinen Fall verwenden, damit wird der gesamte Python Interpreter beendet.
Code: Alles auswählen
def On_Application_LayoutManagement_testlayout_01_Push0020Button_69_ButtonClicked(sender, button): """Öffnet einen Dateidialog und lässt den Benutzer einen CSV-Dateinamen
auswählen, der dann zurückgegeben wird. """
import win32ui,win32con,sys
fd = win32ui.CreateFileDialog(1,'','', 0,'Csv |*.csv')
fd.SetOFNTitle("Select CSV File")
if fd.DoModal() == win32con.IDCANCEL: sys.exit(1)
print fd.GetPathName().replace('\\','/')
a=fd.GetPathName().replace('\\','/')
return a.
Der Hinweis ist doch recht eindeutig. Du sollst kein ``sys.exit`` verwenden, da sonst der gesamte Interpreter beendet wird. Das ist auch ein extrem unerwartetes Verhalten, wenn man bei einem Dialog auf Cancel drückt. Implementiere einfach sinnvolles Verhalten.
Ansonsten sieht der Code nach Chaos aus. Importe gehören in der Regel nicht in Funktionen, sondern in den Kopf des Moduls. Das if-Statement in Zeile 6 solltest du in zwei Zeilen aufteilen, so ist das kaum lesbar. Auch ist das a in Zeile 8 unnötig, du kannst das Ergebnis gleich mittels return zurückgeben. Auch das Ersetzten der Backslashes mit Slashes sieht falsch aus. Was möchtest du damit bezwecken?
Ansonsten sieht der Code nach Chaos aus. Importe gehören in der Regel nicht in Funktionen, sondern in den Kopf des Moduls. Das if-Statement in Zeile 6 solltest du in zwei Zeilen aufteilen, so ist das kaum lesbar. Auch ist das a in Zeile 8 unnötig, du kannst das Ergebnis gleich mittels return zurückgeben. Auch das Ersetzten der Backslashes mit Slashes sieht falsch aus. Was möchtest du damit bezwecken?
Das Leben ist wie ein Tennisball.