Benutzer:SlashMe/StockCar.py
Zur Navigation springen
Zur Suche springen
Information
[Bearbeiten | Quelltext bearbeiten]Mit diesem Python-Skript und den Daten aus der CSV-Datei unter Benutzer:SlashMe/StockCar.csv kann die Tabelle unter TV total Stock Car Crash Challenge#Medaillengewinner erstellt werden.
Inhalt der Datei
[Bearbeiten | Quelltext bearbeiten]#!/usr/bin/env python
# -*- coding: utf-8 -*-
import csv, sys
"""
Formatiert und sortiert die Medaillengewinner der [[TV total Stock Car Crash Challenge]]
Aufruf: python StockCar.py <Tabelle.csv >Wiki.txt
Tabelle sollte eine CSV-Datei sein, mit Tabs getrennt, mit " umschlossen.
In der ersten Zeile müssen die Spalten stehen:
"Name" "Link" "Land" "von" "bis" "Gold" "Silber" "Bronze" "Rodeo{{FN|1}}"
Link ist dabei die Zielseite, z.B. "Elton (Moderator)", kann leer gelassen werden, wenn identisch zum Namen.
"""
# Hilfsfunktionen für die Ausgabe
last_points = None
last_rank = None
def key_position(data, title, row_number):
"Gibt den Platz des Teilnehmers aus. Mit last_points und last_rank wird bei gleichen Punktzahlen der gleiche Platz ausgegeben."
global last_points, last_rank
if row_value(data) == last_points:
pos = last_rank
else:
pos = row_number+1
last_points = row_value(data)
last_rank = pos
if pos < 10:
return "{{0}}%s." % pos
return "%s." % pos
def key_name(data, title, row_number):
"Gibt den Namen aus, verlinkt und mit SortKey."
name = data['Name']
link = data['Link']
sort = name.split(" ")
sort.reverse()
sort = ", ".join(sort)
if link != "" and link != name:
name = '%s|%s' % (link, name)
return 'align="left" | {{SortKey|%s|[[%s]]}}' % (sort, name)
def key_country(data, title, row_number):
"Gibt das Land des Teilnehmers über die entsprechende Vorlage aus."
return 'align="left" | {{%s}}' % data['Land']
def key_sum(data, title, row_number):
"Gibt die Anzahl der Gesamtsiege aus"
return sum((int(data[i]) for i in ('Gold', 'Silber', 'Bronze', 'Rodeo{{FN|1}}')))
# Welche Spalten bestimmen die Reihenfolge und wie stark werden sie gewichtet?
ratings = \
{
'Gold': 1000,
'Silber': 100,
'Bronze': 10,
'Rodeo{{FN|1}}': 999
}
# Welche Spalten sollen ausgegeben werden?
# Bedeutung der Werte
# 0: Titel der Spalte
# 1: Farbe des Spaltenkopfs (leer für Standard)
# 2: Farbe der Spalte (leer für Standard)
# 3: Eine Funktion, die den Inhalt der Spalte formatieren/berechnen soll.
columns = \
(
('Platz', '', '', key_position),
('Name', '', '', key_name),
('Land', '', '', key_country),
('von', '', '', None),
('bis', '', '', None),
('Gold', 'FFD700', 'F7F6A8', None),
('Silber', 'C0C0C0', 'DCE5E5', None),
('Bronze', 'CC9966', 'FFDAB9', None),
('Rodeo{{FN|1}}', '', '', None),
('Gesamt', '', '', key_sum)
)
def row_value(row):
"Berechnet die Punktzahl. Wird zur Sortierung benutzt"
points = 0
for i in ratings:
points += ratings[i] * float(row[i])
return -points # Sortierung umkehren
def format(fileIn, fileOut, key, columns, ratings):
"""
Liest die CSV-Datei fileIn ein, sortiert sie und gibt das Wiki-Markup in fileOut aus.
"""
reader = csv.DictReader(fileIn, delimiter='\t', quotechar='"')
rows = sorted(reader, key=key)
fileOut.write('<!-- Erstellt mit [[Benutzer:SlashMe/StockCar.py]] -->\n{| class="wikitable sortable center" width="100%"\n|-\n')
for title, color_title, color_body, func in columns:
if color_title:
fileOut.write('! style="background-color:#%s" | %s\n' % (color_title, title))
else:
fileOut.write('! %s\n' % title)
i = 0
for row in rows:
fileOut.write('|-\n');
for title, color_title, color_body, func in columns:
if color_body:
fileOut.write('| bgcolor="#%s" | ' % color_body)
else:
fileOut.write('| ')
if func:
fileOut.write('%s\n' % func(row, title, i))
else:
fileOut.write('%s\n' % row[title])
i += 1
fileOut.write('|}\n')
if __name__ == '__main__':
format(sys.stdin, sys.stdout, row_value, columns, ratings)