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