2016-09-10 2 views
1

Ich versuche, die Daten aus einer CSV-Spalte in eine HTML-TabellePython - drucken Sie eine CSV-Zeile in eine HTML-Spalte

CSV-Datei ist wie folgt (Probe)

firstname, surname 
firstname, surname 
firstname, surname 
firstname, surname 
firstname, surname 
firstname, surname 
firstname, surname 

Ich kann drucken lesen sie diese Daten in Ordnung - und bekommen es über die folgenden in eine Tabelle zu drucken:

import csv 
import sys 
from fpdf import FPDF, HTMLMixin 

#load in csv file 
data = csv.reader(open(sys.argv[1])) 

names = "" 

#Read column names from first line of the file 
fields = data.next() 
for row in data: 
    names = row[0] + " " + row[1] 
    html_row = " <tr> " 
    html_col = " <td border=0 width=15%>" + names + "</td></tr>" 
    html_out = html_out + html_row + html_col 


html = html_header + html_out + html_footer 
print html 
pdf.write_html(html) 
pdf.output('test2.pdf', 'F') 

dies folgendes ergibt:

<tr><td border=0 width=15%>firstname surname</td></tr> 
<tr><td border=0 width=15%>firstname surname</td></tr> 
<tr><td border=0 width=15%>firstname surname</td></tr> 

heißt - jeder Name ist auf einer separaten Zeile - was ich möchte ist

<tr><td border=0 width=15%>firstname surname</td><td border=0 width=15%>firstname surname</td><td border=0 width=15%>firstname surname</td></tr> 

dank

+1

Ist es möglich, dass Sie eine Einrückung in der Zeile 'html_out = html_out + ....' verpassen, bc derzeit ist es nicht Teil der Schleife, die Ihnen nicht das Ergebnis in Ihrer Frage angezeigt würde? – DAXaholic

+1

schlechte Formatierung von meinem Teil dort - sollte jetzt behoben werden .. – beingverysilly

+0

Auch 'html_rowend' ist nicht irgendwo im angezeigten Code festgelegt. also läuft das wie gezeigt? – Dilettant

Antwort

-1

jeden Namen als Zellenspalte Zelle zu tun haben, nur Sie benötigen einen <tr> ein machen einreihig

table, td { 
 
    border: solid 1px #CCC; 
 
}
<table> 
 
    <tr> 
 
     <td>firstname surname</td> 
 
     <td>firstname surname</td> 
 
     <td>firstname surname</td> 
 
    </tr> 
 
</table>

Um diese Arbeit in Ihrem Code zu machen, müssen Sie Sie außerhalb der Schleife Zeile erstellen:

html_row = '<tr>' # open row 

for row in data: 
    names = row[0] + " " + row[1] 
    # append columns to the row 
    html_row += "<td border=0 width=15%>" + names + "</td>" 

html_row += '</tr>' # close row 

html_out = html_row 
0

Einige Variablen in der Probe nicht festgelegt, aber das ist aufgrund der Reduzierung der Probe zu aminimal Größe Ich denke, wenn Sie diese Details ausfüllen, sollte das folgende funktionieren (suboptimal, wenn mehr als 7 Einträge aufgrund der Hardcoded 15% Breite auf dem HTML-td-Element.

import csv 
import sys 
from fpdf import FPDF, HTMLMixin 

# load in csv file 
data = csv.reader(open(sys.argv[1])) 

# Read column names from first line of the file to ignore them 
fields = data.next() 

Unten wurde die Schleife von Frage durch ein Listenverständnis ersetzt. cell_att enthält die angegebenen Attribute der Tabellenzellenelemente und wird wie die Zeilen [0] und die Zeile [1] in die Zeichenfolgen der html_out-Liste interpoliert.

cell_att = " border=0 width=15%" 
row_data = ["<td%s>%s %s</td>" % (cell_att, row[0], row[1]) for row in data] 

Hier eine schließt sich einfach alle Zellen und spritzt in eine HTML-Tabellenzeile Element:

html_out = "<tr>" + "".join(row_data) + "</tr>" 

html = html_header + html_out + html_footer 
print html 
pdf.write_html(html) 
pdf.output('test2.pdf', 'F') 

Die anderen Antworten auch esp IMO nützliche Hinweise geben. auf dem Styling-Level des HTML. Falls Sie später entscheiden, mehr als 7 Namen zu verdauen/umzuwandeln, ist der obige Code möglicherweise ein guter Anfang, um Zeilen mit höchstens 7 Zellen zu erstellen oder den Attributwert der Breite durch geringfügige Änderungen anzupassen.