Skip to content

Instantly share code, notes, and snippets.

Created August 31, 2012 15:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/3554990 to your computer and use it in GitHub Desktop.
Save anonymous/3554990 to your computer and use it in GitHub Desktop.
Flexibles Menü, zum Handeln spaltengetrennter Dateien
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import os
import platform
import subprocess
'''
Ermittelt das Betriebssystem mit dem dazugehörigen Programmstarter
und öffnet die an fileopen übergebene Datei damit.
Damit das Modul eingesetzt werden kann, muß dieses importiert werden.
from filestart import fileopen
Der Aufruf lautet:
fileopen(filename)
'''
def filestarter():
'''
Betriebssytem ermitteln und Programmstarter
an Funktion fileopen übergeben.
'''
try:
return {'Windows': 'start',
'Linux': 'xdg-open',
'Darwin': 'open'
}[platform.system()]
except KeyError:
raise RuntimeError(
'Für Ihr Betriebssystem\n%s\nkonnte kein passender Starter ermittelt werden!' % platform.platform())
def fileopen(filename):
'''
Datei mit Programmstarter von Funktion fileopen öffnen.
'''
try:
default_program = filestarter()
except RuntimeError as e:
print(e)
print('\nÖffnen Sie zum Editieren der Datei %s einen Texteditor.\nDie Datei %s befindet sich unter\n%s.' % (filename, chance, os.path.realpath(filename)))
else:
print('Datei %s wird mit dem Standardprogramm\nIhres Betriebsystem zum Editieren geöffnet!' % filename)
process = subprocess.Popen([default_program, filename])
process.wait()
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import os
import re
import csv
import string
import subprocess
import time
import codecs
from privatparam import datapool, headings, headdistance, listfilter, spelling
from filestart import fileopen
# Temporäre Datei
chance = 'chance.txt'
def write_csv(filename, datenpool):
with codecs.open(filename, "w") as zielfile:
writer = csv.writer(zielfile, delimiter="\t", quotechar="^")
writer.writerows(datenpool)
def writeappend_csv(filename, datenpool):
with codecs.open(filename, "a") as zielfile:
writer = csv.writer(zielfile, delimiter="\t", quotechar="^")
writer.writerows(datenpool)
def spellings(entry):
if spelling == 1:
entry = entry.upper()
entry = entry.replace('[ä]', 'Ä')
entry = entry.replace('[ö]', 'Ö')
entry = entry.replace('[ü]', 'Ü')
elif spelling == 2:
entry = entry.lower()
entry = entry.replace('[Ä]', 'ä')
entry = entry.replace('[Ö]', 'ö')
entry = entry.replace('[Ü]', 'ü')
return entry
def fileclean(filename):
try:
return os.remove(filename)
except OSError:
return
def switch(menupoint, result):
selection(menupoint, result)
def get_formatted_table(menupoint, headings, contents, spacing=4, numeration_width=10):
lines = [headings] + contents
column_widths = [max(len(item) for item in column_items)
for column_items in zip(*lines)]
total_width = sum(column_widths) + (len(column_widths) - 1) * spacing
total_width += numeration_width
dashed_line = total_width * '-'
blank_line = total_width * ' '
numeration_spec = '{{:>{}}}'.format(numeration_width)
column_specs = ['{{:{}}}'.format(width) for width in column_widths]
line_template = numeration_spec + (spacing * ' ').join(column_specs)
headline = line_template.format('Nummer: ', *headings)
formatted_lines = [dashed_line,
headline,
blank_line,
dashed_line]
dataline = dict()
for numeration, text_items in enumerate(contents, 1):
dataline[numeration] = [text_items]
numeration_string = '{}: '.format(numeration)
formatted_lines.append(line_template.format(numeration_string,
*text_items))
formatted_lines.append(blank_line)
formatted_lines.append(dashed_line)
print('\n'.join(formatted_lines))
return selection(menupoint, dataline)
def search_base(menupoint):
result = 0
return search_entry(menupoint, result)
def search_entry(menupoint, result):
entry = input('\nSuchbegriff: ')
entry = spellings(entry)
if entry:
print("\nListe wird nach Suchbegriff durchsucht!")
if not type(result) == list:
with open(datapool, 'r') as infile:
reader = csv.reader(infile, delimiter="\t", quotechar="^")
contents = [row for row in reader if any(entry in x for x in row)]
elif type(result) == list:
contents = [row for row in result if any(entry in x for x in row)]
if contents:
if len(contents) == 1:
print("\nDie Suche ergab folgendes Ergebnis:")
else:
print("\nDie Suche ergab folgende Ergebnisse:")
return get_formatted_table(menupoint, headings, contents)
else:
print('\nEs liegen keine Ergebnisse zu dem Suchbegriff %s vor\n' % entry)
else:
print("\nAbbruch, Sie haben keine Eingabe gemacht!")
return
def selection(menupoint, result):
if listfilter == 'ja' and len(result) > 1:
if input('Möchten Sie das Ergebnis weiter filtern?\n< ja / [TASTE] für Abbruch > ') == 'ja':
return search_entry(menupoint, [row for key in result for row in
result[key]])
if menupoint == 'suchen':
return
contents = list()
while True:
try:
selection = int(input('\nZeilennummer oder [TASTE] für Abbruch: '))
if 0 != selection <= len(result):
data = [row for key in result if key == selection
for row in result.get(selection)]
print("\nDatensatz wird zur Auswahl hinzu gefügt!\n")
if os.path.exists(os.path.join(os.getcwd(), chance)):
writeappend_csv(chance, data)
else:
write_csv(chance, data)
contents = [row for key in result if key != selection
for row in result[key]]
if len(result) > 1 and input('Weitere Auswahl treffen?\n< ja / [TASTE] für Abbruch > ') == 'ja':
return get_formatted_table(menupoint, headings, contents)
break
else:
print('\nFalsche Eingabe, bitte wählen Sie eine Zahl von 1 bis %s aus!' % len(result))
except (ValueError, IndexError):
break
if not os.path.exists(os.path.join(os.getcwd(), chance)):
return
elif menupoint == 'ändern':
load(menupoint)
elif menupoint == 'löschen':
remove_entry(menupoint)
elif menupoint == 'speichern':
save(menupoint)
return
def add_entry(menupoint):
print('')
newdata = list()
newdata = ([(input('Eintrag zu: %s > ' % info)) for info in headings])
if newdata[0] and newdata[1]:
if input('\nMöchten sie diesen Eintrag in die Liste übernehmen?\n%s\n< ja / [TASTE] für Abbruch > ' % newdata) == 'ja':
print("\nEintrag wird hinzugefügt\n")
writeappend_csv(datapool, [newdata])
else:
print("\nEintrag wird nicht hinzugefügt\n")
return sort(menupoint)
def load(menupoint):
if not os.path.exists(os.path.join(os.getcwd(), chance)):
search_base(menupoint)
return
fileopen(chance) # Textdatei chance mit Standardprogramm des Betriebsystems öffnen
with open(chance, 'r') as zielfile:
reader = csv.reader(zielfile, delimiter="\t", quotechar="^")
olddata = [row for row in reader]
if input('\nÄnderung übernehmen?\n< ja / [TASTE] für Abbruch > ') == 'ja':
with open(chance, 'r') as zielfile:
reader = csv.reader(zielfile, delimiter="\t", quotechar="^")
[writeappend_csv(datapool, [row]) for row in reader]
write_csv(chance, olddata)
remove_entry(menupoint)
else:
print("\nDie Änderungen werden nicht übernommen!\n")
return sort(menupoint)
def remove_entry(menupoint):
if not os.path.exists(os.path.join(os.getcwd(), chance)):
search_base(menupoint)
return
with codecs.open(chance, 'r') as zielfile:
reader = csv.reader(zielfile, delimiter="\t", quotechar="^")
olddata = [row for row in reader]
with codecs.open(datapool, 'r') as zielfile:
reader = csv.reader(zielfile, delimiter="\t", quotechar="^")
newlist = [row for row in reader for old in olddata if old != row]
write_csv(datapool, newlist)
return sort(menupoint)
def sort(menupoint):
print("\nListe wird sortiert und von doppelten Datensätzen bereinigt!\n")
newlist = set()
with open(datapool, 'r') as zielfile:
reader = csv.reader(zielfile, delimiter="\t", quotechar="^")
return write_csv(datapool, sorted([row for row in reader]))
def quit(menupoint):
print("\nProgramm wird beendet!\n")
exit()
def handle_menu(menu):
while True:
print('\n<<< Hauptmenü >>>')
for index, row in enumerate(menu, 1):
print("{} {}".format(index, row[0]))
try:
fileclean(chance)
choice = int(input("Nummer: ")) - 1
menu[choice][1](menu[choice][2])
except (ValueError, IndexError):
print("\nBitte nur Zahlen im Bereich 1 - {} eingeben\n".
format(len(menu)))
menu = [
["Eintrag suchen", search_base, 'suchen'],
["Eintrag hinzufügen", add_entry, 'hinzufügen'],
["Eintrag ändern", load, 'ändern'],
["Eintrag löschen", remove_entry, 'löschen'],
["Beenden", quit, 'beenden']
]
handle_menu(menu)
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
Nehmen Sie hier Ihre persöhnliche Einstellungen vor.
:param:datapool
Datei in dem die Daten enthalten sind.
:param:headings
Spaltenbenennung, bezogen auf die Datendatei.
Es müssen dazu nicht alle Spalten der Datendatei aufgelistet werden.
Wichtig ist aber, daß die Spaltenangaben von links (Spalte "0")
fortlaufend beginnen!
FALSCH: Spalte[0], Spalte[3], Spalte[4], Spalte[7],
RICHTIG: Spalte[0], Spalte[1], Spalte[2], Spalte[3], Spalte[4], Spalte[5], Spalte[6], Spalte[7],
:param:headdistance
10 = alle 10 Zeilen
ODER
25 = alle 25 Zeilen
0 = keine Wiederholung
:param:listfilter
Ermöglicht eine weitere Filterung des Suchergebnisses
Mit 'ja' ist der Filter aktiv, mit 'nein' Filter nicht aktiv.
:param:spelling
0 = Groß-/Kleinschreibung wird beachtet
1 = Alle Eingaben werden in Großschreibung umgewandelt
2 = Alle Eingaben werden in Kleinschreibung umgewandelt
'''
# Datendatei
#datapool = 'pythoninfo.txt'
#datapool = 'LISTE_ARTIKELGESAMT.txt'
datapool = 'LISTE_BASE.txt'
# Kopfzeile
#headings = 'Python2', 'Python3', 'Info'
headings = 'Hersteller', 'H-Nummer', 'VE', 'Inhalt', 'Beschreibung'
# Wiederholung der Kopfzeile
headdistance = 20
# Filter
listfilter = 'ja'
# Sucheingabe
spelling = 1
Tkinter tkinter Namensänderung von Modul Tkinter, neuer Modulnamen ist tkinter. Statt 'from Tkinter import tkinter' gilt nun 'import tkinter'
aa1 2 3
execfile() - Ab Python3 entfällt execfile()
flöte BÄR 123456
from email.MIMEBase import MIMEBase from email.mime.base import MIMEBase Namensänderung von Modul email.MIMEBase, neuer Modulnamen ist email.mime.base
from email.MIMEImage import MIMEImage from email.mime.image import MIMEImage Namensänderung von Modul email.MIMEImage, neuer Modulnamen ist email.mime.image
from email.MIMEMultipart import MIMEMultipart from email.mime.multipart import MIMEMultipart Namensänderung von Modul email.MIMEMultipart, neuer Modulnamen ist email.mime.multipart
from email.MIMEText import MIMEText from email.mime.text import MIMEText Namensänderung von Modul email.MIMEText, neuer Modulnamen ist email.mime.text
keiner hats wer
print print() print(obj), Objekt muss in Klammern eingeschlossen sein.
raw_input() input() raw_input() wurde durch input() ersetzt.
sys.maxint sys.maxsize Änderung, jedes Vorkommen von sys.maxint wird zu sys.maxsize
test TEST Änderung
tkFont tkinter.font Namensänderung von Modul tkFont, neuer Modulnamen ist tkinter.font
tkMessageBox tkinter.messagebox Namensänderung von Modul tkMessageBox, neuer Modulnamen ist tkinter.messagebox
tkSimpleDialog tkinter.simpledialog Namensänderung von Modul tkSimpleDialog, neuer Modulnamen ist tkinter.simpledialog
xrange range xrange unter Python3 nicht mehr nutzbar
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment