2017-06-16 3 views
0

Also habe ich ein kleines Programm, das einen DB-Aufruf macht und es dann in ein PDF umwandelt. Ich habe die meisten von ihnen arbeiten, aber diese letzte gibt einen Key Error auf mich zurück und ich kann nicht herausfinden, warum. HierPython Key Fehlerfilterung MySQL

ist ein Beispiel für die Daten, die von der DB zurückgegeben werden:

((None, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 26, 0, 26), (1, 1, 0, 0, 0, 17, 0, 18), (2, 0, 0, 0, 0, 15, 0, 16)) 

Die Traceback: Traceback (jüngste Aufforderung zuletzt):

File "C:\Users\Ace\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1699, in __call__ 
    return self.func(*args) 
    File "C:/Users/Ace/Desktop/IPNV/KP_App/FML/firstapp.py", line 232, in hrday_in 
    hourday_filter(noodle, dest, drange) 
    File "C:\Users\Ace\Desktop\IPNV\KP_App\FML\dataIN.py", line 187, in hourday_filter 
    doc.export(pths, drange) 
    File "C:\Users\Ace\Desktop\IPNV\KP_App\FML\calazan.py", line 58, in export 
    reverse=reverse_order) 
KeyError: 'h' 

Ich bin nicht einmal sicher, wo die " h 'kommt von. Hier

ist die Funktion, die ich die Daten durchlaufen für die PDF-Generation vorzubereiten:

def hourday_filter(tuna, pth, drange): 
    data = [] 
    for hr, number, local, chicken, alligator, ace, lola, chunk in tuna: 
     data.append({'hour': hr, 
        'number': number, 
        'local': local, 
        'long': chicken, 
        'inter': alligator, 
        'income': ace, 
        'tandem': lola, 
        'total': chunk}) 

    fields = (
     ('hour', 'Hour of Day'), 
     ('number', 'Internal Calls '), 
     ('local', 'Local Calls'), 
     ('long', 'Long Distance Calls'), 
     ('inter', 'International Calls '), 
     ('income', 'Incoming Calls'), 
     ('tandem', 'Tandem Calls'), 
     ('total', 'Total Calls'), 
    ) 

    pths = pth + '/HourofDay.pdf' 
    doc = DataToPdf(fields, data, sort_by='hr', 
        title='Hour of Day Report') 
    doc.export(pths, drange) 

und von dort aus werden die Daten an diese Funktion übergeben, um es tatsächlich zu konvertieren zu pdf.

class DataToPdf: 
    """ 
    Export a list of dictionaries to a table in a PDF file. 
    """ 
    def __init__(self, fields, data, sort_by=None, title=None): 
     """ 
     Arguments: 
      fields - A tuple of tuples ((fieldname/key, display_name)) 
       specifying the fieldname/key and corresponding display 
       name for the table header. 
      data - The data to insert to the table formatted as a list of 
       dictionaries. 
      sort_by - A tuple (sort_key, sort_order) specifying which field 
       to sort by and the sort order ('ASC', 'DESC'). 
      title - The title to display at the beginning of the document. 
     """ 
     self.fields = fields 
     self.data = data 
     self.title = title 
     self.sort_by = sort_by 

    def export(self, filename, drange, data_align='LEFT', table_halign='LEFT'): 
     doc = SimpleDocTemplate(filename, pagesize=letter) 
     styles = getSampleStyleSheet() 
     styleH = styles['Heading1'] 
     styleD = styles['Heading4'] 
     date = time.strftime("%m/%d/%Y") 
     date2 = 'Ran on: ' + date 
     date3 = ' For the period ' + str(drange[0]) + ' to ' + str(drange[1]) # Edit here to display report date range 
     story = [] 
     if self.title: 
      story.append(Paragraph(self.title, styleH)) 
      story.append(Spacer(1, 0.25 * inch)) 
      story.append(Paragraph(date2, styleD)) 
      story.append(Spacer(1, 0.015 * inch)) 
      story.append(Paragraph(date3, styleD)) 

     if self.sort_by: 
      reverse_order = False 
      if str(self.sort_by[1]).upper() == 'DESC': 
       reverse_order = False 

      self.data = sorted(self.data, 
           key=itemgetter(self.sort_by[0]), 
           reverse=reverse_order) 

     converted_data = self.__convert_data() 
     table = Table(converted_data, hAlign=table_halign) 
     table.setStyle(TableStyle([ 
      ('FONT', (0, 0), (-1, 0), 'Helvetica-Bold'), 
      ('ALIGN', (0, 0), (-1, 0), 'CENTER'), 
      ('ALIGN', (0, 0), (0, -1), data_align), 
      ('INNERGRID', (0, 0), (-1, -1), 0.50, colors.black), 
      ('BOX', (0, 0), (-1, -1), 0.25, colors.black), 
     ])) 

     data_len = len(converted_data) 

     for each in range(data_len): 
      if each % 2 == 0: 
       bg_color = colors.whitesmoke 
      else: 
       bg_color = colors.lightgrey 

      table.setStyle(TableStyle([('BACKGROUND', (0, each), (-1, each), bg_color)])) 

     story.append(table) 
     doc.build(story) 

    def __convert_data(self): 
     """ 
     Convert the list of dictionaries to a list of list to create 
     the PDF table. 
     """ 
     # Create 2 separate lists in the same order: one for the 
     # list of keys and the other for the names to display in the 
     # table header. 
     keys, names = zip(*[[k, n] for k, n in self.fields]) 
     new_data = [names] 

     for d in self.data: 
      new_data.append([d[k] for k in keys]) 

     return new_data 

Ist es möglich, dass das erste Ergebnis der db (die null eins) ist der Grund dafür? Ich habe jetzt ungefähr ein Dutzend dieser Berichte ohne Probleme gemacht, ich bin mir nicht sicher, wo ich hier herumhaue.

+0

Ich denke, die 'H' herkommt, wo Sie tun 'self.sort_by [0 ] 'im 'sortierten' Funktionsaufruf, wobei' self.sort_by' '' hr'' ist. War 'sort_by' irgendwann ein Tupel? – FamousJameous

+0

Es hätte nicht sein sollen. Das Datenbeispiel, das ich gepostet habe, ist, was an den Anruf übergeben werden soll. – Joe

+0

Ich habe den Parameter 'sort_by' aus dem hour_day() Filter entfernt und jetzt druckt er! So'ne Art. passte nicht ganz in die Seite, aber das ist ein Pferd mit einer anderen Farbe. Weißt du, warum das das gebrochen hat? – Joe

Antwort

0

Also danke an FamousJameous Ich erkannte, dass es in der Tat das erste Feld war, das meinen Filter tötete. Der sort_by-Aufruf konnte nicht mit dem NULL-Wert umgehen. Es gelang mir, es zu beheben, indem ich das erste Feld aus dem Tupel entfernte.

Die Datenbank, die Ergebnisse in die Variable result Von dort zurückgekehrt: new_result = result[1:] dieser Zeile wird die NULL-Linie entfernt und stoppte den Fehler