2016-04-20 8 views
0

Ich versuche, meine Datenbanktabelle Daten auszugeben, die neben langen Tabellenzeilen funktioniert. Die Spalten müssen so groß wie die längste Datenbankzeile sein. Ich habe Probleme beim Implementieren einer Berechnung, um die Tabelle proportional anstelle einer riesigen Unordnung auszugeben, wenn lange Zeilen ausgegeben werden (ohne eine Drittanbieterbibliothek zu verwenden, z. B. Print results in MySQL format with Python). Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.Python-Ausgabe Länge

Datenbankverbindung:

connection = sqlite3.connect("test_.db") 
c = connection.cursor() 

c.execute("SELECT * FROM MyTable") 
      results = c.fetchall() 
      formatResults(results) 

Tabellenformatierung:

def formatResults(x): 
    try: 
      widths = [] 
      columns = [] 
      tavnit = '|' 
      separator = '+' 

      for cd in c.description: 
       widths.append(max(cd[2], len(cd[0]))) 
       columns.append(cd[0]) 

      for w in widths: 
       tavnit += " %-"+"%ss |" % (w,) 
       separator += '-'*w + '--+' 

      print(separator) 
      print(tavnit % tuple(columns)) 
      print(separator) 
      for row in x: 
       print(tavnit % row) 
      print(separator) 
      print "" 
    except: 
     showMainMenu() 
     pass 

Output Problem Beispiel:

+------+------+---------+ 
| Date | Name | LinkOrFile | 
+------+------+---------+ 
| 03-17-2016 | hi.com | Locky | 
| 03-18-2016 | thisisitsqq.com | None | 
| 03-19-2016 | http://ohiyoungbuyff.com\69.exe?1 | None | 
| 03-20-2016 | http://thisisitsqq..com\69.exe?1 | None | 
| 03-21-2016 | %Temp%\zgHRNzy\69.exe | None | 
| 03-22-2016 |  | None | 
| 03-23-2016 | E52219D0DA33FDD856B2433D79D71AD6 | Downloader | 
| 03-24-2016 | microsoft.com | None | 
| 03-25-2016 | 89.248.166.132 | None | 
| 03-26-2016 | http://89.248.166.131/55KB5js9dwPtx4= | None | 
+1

Was genau ist das Problem, vor dem Sie stehen? – trans1st0r

+0

Siehe Bearbeiten oben. – user5792975

+0

Haben Sie die Ausgabe der variablen Breiten gedruckt? Enthält es die Länge des längsten Werts pro Spalte? – trans1st0r

Antwort

0

Wenn Ihr Hauptproblem Spalte macht Breiten konsistent über alle Linien, diese Python-Paket könnte den Job erledigen: https://pypi.python.org/pypi/tabulate

Im Folgenden finden Sie ein sehr einfaches Beispiel für einen möglichen Formatierungsansatz. Der entscheidende Punkt ist die größte Länge jeder Spalte zu finden und dann format Methode des String-Objekts verwenden:

#!/usr/bin/python 

import random 
import string 
from operator import itemgetter 


def randomString(minLen = 1, maxLen = 10): 
    """ Random string of length between 1 and 10 """ 
    l = random.randint(minLen, maxLen) 
    return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(l)) 

COLUMNS = 4 

def randomTable(): 
    table = [] 
    for i in range(10): 
     table.append([randomString() for j in range(COLUMNS)]) 
    return table 

def findMaxColumnLengs(table): 
    """ Returns tuple of max column lengs """ 
    maxLens = [0] * COLUMNS 
    for l in table: 
     lens = [len(s) for s in l] 
     maxLens = [max(maxLens[e[0]], e[1]) for e in enumerate(lens)] 

    return maxLens 



if __name__ == '__main__': 
    ll = randomTable() 

    ml = findMaxColumnLengs(ll) 

    # tuple of formatting statements, see format docs 
    formatStrings = ["{:<%s}" % str(m) for m in ml ] 
    fmtStr = "|".join(formatStrings) 

    print "==================================" 
    for l in ll: 
     print l 
    print "==================================" 
    for l in ll: 
     print fmtStr.format(*l) 

Dieser druckt die Anfangstabelle in der Liste der Listen und die formatierten Ausgabe gepackt.

================================== 
['2U7Q', 'DZK8Z5XT', '7ZI0W', 'A9SH3V3U'] 
['P7SOY3RSZ1', 'X', 'Z2W', 'KF6'] 
['NO8IEY9A', '4FVGQHG', 'UGMJ', 'TT02X'] 
['9S43YM', 'JCUT0', 'W', 'KB'] 
['P43T', 'QG', '0VT9OZ0W', 'PF91F'] 
['2TEQG0H6A6', 'A4A', '4NZERXV', '6KMV22WVP0'] 
['JXOT', 'AK7', 'FNKUEL', 'P59DKB8'] 
['BTHJ', 'XVLZZ1Q3H', 'NQM16', 'IZBAF'] 
['G0EF21S', 'A0G', '8K9', 'RGOJJYH2P9'] 
['IJ', 'SRKL8TXXI', 'R', 'PSUZRR4LR'] 
================================== 
2U7Q  |DZK8Z5XT |7ZI0W |A9SH3V3U 
P7SOY3RSZ1|X  |Z2W  |KF6  
NO8IEY9A |4FVGQHG |UGMJ |TT02X  
9S43YM |JCUT0 |W  |KB   
P43T  |QG  |0VT9OZ0W|PF91F  
2TEQG0H6A6|A4A  |4NZERXV |6KMV22WVP0 
JXOT  |AK7  |FNKUEL |P59DKB8 
BTHJ  |XVLZZ1Q3H|NQM16 |IZBAF  
G0EF21S |A0G  |8K9  |RGOJJYH2P9 
IJ  |SRKL8TXXI|R  |PSUZRR4LR 
+0

er möchte nicht ein Paket verwenden, wie seine Frage erwähnt. – trans1st0r

+0

Ja, ich möchte das ohne ein Paket machen. – user5792975

+0

Entschuldigung, das habe ich übersehen. Ich habe ein Beispiel hinzugefügt – paceholder

0

Der Code, den Sie ist für MySQL verwendet. Der kritische Teil ist die Zeile widths.append(max(cd[2], len(cd[0]))), wobei cd[2] die Länge der längsten Daten in dieser Spalte angibt. Dies funktioniert für MySQLdb.

Sie sind jedoch mit sqlite3, für die der Wert cd[2]-None gesetzt: https://docs.python.org/2/library/sqlite3.html#sqlite3.Cursor.description

So müssen Sie die folgende Logik ersetzen:

for cd in c.description: 
       widths.append(max(cd[2], len(cd[0]))) 
       columns.append(cd[0]) 

mit Ihrem eigenen. Der Rest des Codes sollte in Ordnung sein, solange widths korrekt berechnet wird.

Der einfachste Weg, um die widths Variable richtig zu erhalten, wäre, durch jede Zeile des Ergebnisses zu durchlaufen und die maximale Breite jeder Spalte herauszufinden, dann an widths anhängen. Dies ist nur einige Pseudo-Code:

for cd in c.description: 
    columns.append(cd[0]) # Get column headers 

widths = [0] * len(c.description) # Initialize to number of columns. 
for row in x: 
    for i in range(len(row)): # This assumes that row is an iterable, like list 
    v = row[i] # Take value of ith column 
    widths[i] = max(len(v), widths[i]) # Compare length of current value with value already stored 

Am Ende dieser, widths sollte die maximale Länge jeder Spalte enthalten.

+0

Ok, wie würde ich die von Ihnen erwähnte Logik ersetzen? Können Sie bitte eine Probe zur Verfügung stellen? – user5792975

+0

Ich bin mir nicht sicher, wie ich das machen würde. – user5792975

+0

@ user5792975 bearbeitet mit pseduo Code, müssen Sie möglicherweise ein paar Zeilen ändern .. – trans1st0r