Python Scripts
Aus Digitalkultur
Code-Schnipsel und Hilfestellungen für den vergesslichen Scripter von heute.
Inhaltsverzeichnis |
Relative Imports
Folgende Ordnerstruktur ist gegeben:
*folderbase **foldersub ***file1 **file2
Nehmen wir mal an, man will aus file1 nun file 2 importieren. Dazu gibt es leider keine gute Lösung. Relative imports helfen leider nicht wenn man file1 direkt startet (und damit __name__ == __main__ ist.) Eine Lösung die aber funktioniert ist folgende (in Datei file1):
sys.path.append(os.path.abspath(__file__).rsplit('/',2)[0])
import file2
Dazu wird der aktuelle Ordner rausgesucht, der Überordner genommen und dann sys.path hinzugefügt damit der folgende import file2 finden kann.
Aktuelle Zeit
from time import strftime
zeit = strftime("%Y-%m-%d %H:%M:%S")
Encoding
In utf-8 encodieren
def utf8(s):
return unicode(s, "utf-8")
SQL-Insert in Python
def insertFromDict(table, dict):
sql = 'INSERT INTO ' + table
sql += ' ('
sql += ', '.join(dict)
sql += ') VALUES ('
sql += ', '.join(map(dictValuePad, dict))
sql += ');'
return sql
def dictValuePad(key):
return '%(' + str(key) + ')s'
products = {"name":"produkttitel, "price":123}
cursor.execute(insertFromDict("s_products", products), products)
HTML Formulare mit mod_python
def insertAll(file):
#write file handle
return
def index(req):
req.content_type = "text/html"
out =""
if req.form.has_key('csv'):
out += "starting import...<br/>\n"
fileitem = req.form['csv']
if fileitem.filename:
insertAll(fileitem.file)
else:
out += 'No file was uploaded'
out +="finished import"
else:
out += """\
<h1>File Importer</h1>
<form enctype="multipart/form-data" method="post">
<p>File: <input type="file" name="csv"></p>
<p><input type="submit" value="Upload"></p>
</form>
"""
return out
XML-Parsen und HTTP-Download
Einlesen eines XML-Dokuments aus dem Internet. Das XML-Dokument ist in der folgenden Struktur aufgebaut:
<playlist>
<item>
<filename>http://yourdomain.net/file1.txt</filename>
</item>
<item>
<filename>http://yourdomain.net/file2.txt</filename>
</item>
</playlist
Die Datei, die in jedem item unter filename mit einer URL angegeben ist, wird lokal gespeichern. Doppelte Dateien werden erkannt. Bei dem quoten kann es theoretisch zu Problemen kommen wenn ein ':' in der URL enthalten ist da ':' und '/' nicht gequotet werden. Passiert so gut wie nie, sollte man aber im Hinterkopf behalten.
#!/usr/bin/python
from xml.dom import minidom
from urllib2 import Request, urlopen, URLError, HTTPError, quote
import os.path
xmldoc = minidom.parse(urlopen('http://yourdomain.de/file.xml'))
playlist = xmldoc.firstChild
for item in playlist.childNodes:
filename = item.firstChild.firstChild
url = filename.data
localfilename = url.split("/")[-1]
try:
if not os.path.exists(localfilename):
print "downloading " + url
f = urlopen(quote(url, ":/"))
# open local file
local_file = open(localfilename, "wb")
# write local file
local_file.write(f.read())
local_file.close()
else:
print "already existing " + url
#handle errors
except HTTPError, e:
print "HTTP Error:",e.code , url
except URLError, e:
print "URL Error:",e.reason , url

