Ich bin neu in Python. Ich muss einige Daten aus meinem Programm in eine Tabelle schreiben. Ich habe online gesucht und es scheinen viele Pakete verfügbar zu sein (xlwt, XlsXcessive, openpyxl). Andere schlagen vor, in eine CSV-Datei zu schreiben (hat nie CSV verwendet und versteht nicht wirklich, was es ist).
Das Programm ist sehr einfach. Ich habe zwei Listen (Float) und drei Variablen (Strings). Ich kenne die Längen der beiden Listen nicht und sie werden wahrscheinlich nicht gleich lang sein.
Ich möchte, dass das Layout wie in der Abbildung unten dargestellt ist:
Die rosa Spalte enthält die Werte der ersten Liste und die grüne Spalte die Werte der zweiten Liste.
Also, was ist der beste Weg, dies zu tun?
P.S. Ich verwende Windows 7, aber ich habe nicht notwendigerweise Office auf den Computern installiert, auf denen dieses Programm ausgeführt wird.
import xlwt
x=1
y=2
z=3
list1=[2.34,4.346,4.234]
book = xlwt.Workbook(encoding="utf-8")
sheet1 = book.add_sheet("Sheet 1")
sheet1.write(0, 0, "Display")
sheet1.write(1, 0, "Dominance")
sheet1.write(2, 0, "Test")
sheet1.write(0, 1, x)
sheet1.write(1, 1, y)
sheet1.write(2, 1, z)
sheet1.write(4, 0, "Stimulus Time")
sheet1.write(4, 1, "Reaction Time")
i=4
for n in list1:
i = i+1
sheet1.write(i, 0, n)
book.save("trial.xls")
Ich habe dies mit all Ihren Vorschlägen geschrieben. Es erledigt die Arbeit, kann aber etwas verbessert werden.
Wie formatiere ich die Zellen, die in der for-Schleife (list1-Werte) erstellt wurden, als wissenschaftlich oder als Zahl?
Ich möchte die Werte nicht abschneiden. Die tatsächlichen Werte des Programms hätten nach der Dezimalstelle etwa 10 Stellen.
import xlwt
def output(filename, sheet, list1, list2, x, y, z):
book = xlwt.Workbook()
sh = book.add_sheet(sheet)
variables = [x, y, z]
x_desc = 'Display'
y_desc = 'Dominance'
z_desc = 'Test'
desc = [x_desc, y_desc, z_desc]
col1_name = 'Stimulus Time'
col2_name = 'Reaction Time'
#You may need to group the variables together
#for n, (v_desc, v) in enumerate(Zip(desc, variables)):
for n, v_desc, v in enumerate(Zip(desc, variables)):
sh.write(n, 0, v_desc)
sh.write(n, 1, v)
n+=1
sh.write(n, 0, col1_name)
sh.write(n, 1, col2_name)
for m, e1 in enumerate(list1, n+1):
sh.write(m, 0, e1)
for m, e2 in enumerate(list2, n+1):
sh.write(m, 1, e2)
book.save(filename)
zur Erklärung: https://github.com/python-Excel
Verwenden Sie DataFrame.to_Excel von Pandas . Pandas ermöglicht es Ihnen, Ihre Daten in funktionsreichen Datenstrukturen darzustellen und ermöglicht es Ihnen, auch Excel-Dateien einzulesen .
Sie müssen Ihre Daten zunächst in einen DataFrame konvertieren und anschließend in einer Excel-Datei wie folgt speichern:
In [1]: from pandas import DataFrame
In [2]: l1 = [1,2,3,4]
In [3]: l2 = [1,2,3,4]
In [3]: df = DataFrame({'Stimulus Time': l1, 'Reaction Time': l2})
In [4]: df
Out[4]:
Reaction Time Stimulus Time
0 1 1
1 2 2
2 3 3
3 4 4
In [5]: df.to_Excel('test.xlsx', sheet_name='sheet1', index=False)
und die Excel-Datei, die herauskommt, sieht folgendermaßen aus:
Beachten Sie, dass beide Listen gleich lang sein müssen, ansonsten beschwert sich pandas. Um dies zu beheben, ersetzen Sie alle fehlenden Werte durch None
.
xlrd/xlwt (Standard): Python hat diese Funktionalität nicht in seiner Standardbibliothek, aber ich denke an xlrd/xlwt als die "Standardmethode" zum Lesen und Schreiben von Excel-Dateien. Es ist ziemlich einfach, eine Arbeitsmappe zu erstellen, Arbeitsblätter hinzuzufügen, Daten/Formeln zu schreiben und Zellen zu formatieren. Wenn Sie all diese Dinge benötigen, haben Sie mit dieser Bibliothek möglicherweise den größten Erfolg. Ich denke, man könnte sich stattdessen für openpyxl entscheiden, und es wäre ziemlich ähnlich, aber ich habe es nicht verwendet.
Um Zellen mit xlwt zu formatieren, definieren Sie eine XFStyle
und geben Sie den Stil an, wenn Sie in ein Blatt schreiben. Hier ist ein Beispiel mit vielen Zahlenformaten . Siehe Beispielcode unten.
Tablib (leistungsstark, intuitiv): Tablib ist eine leistungsfähigere und dennoch intuitivere Bibliothek zum Arbeiten mit Tabellendaten. Es kann Excel-Arbeitsmappen mit mehreren Blättern sowie mit anderen Formaten wie csv, json und yaml schreiben. Wenn Sie keine formatierten Zellen (wie Hintergrundfarbe) benötigen, tun Sie sich einen Gefallen, wenn Sie diese Bibliothek verwenden, die Sie auf lange Sicht weiterbringen wird.
csv (einfach): Dateien auf Ihrem Computer sind entweder Text oder Binär. Textdateien sind nur Zeichen, einschließlich Sonderzeichen wie Zeilenumbrüche und Registerkarten. Sie können einfach und überall geöffnet werden (z. B. Notepad, Ihr Webbrowser oder Office-Produkte). Eine CSV-Datei ist eine Textdatei, die auf eine bestimmte Weise formatiert ist: Jede Zeile ist eine Liste von Werten, die durch Kommas getrennt sind. Python-Programme können Text problemlos lesen und schreiben. Daher ist eine CSV-Datei der einfachste und schnellste Weg, um Daten aus Ihrem Python-Programm in Excel (oder ein anderes Python-Programm) zu exportieren.
Excel-Dateien sind binär und erfordern spezielle Bibliotheken, die das Dateiformat kennen. Deshalb benötigen Sie eine zusätzliche Bibliothek für Python oder ein spezielles Programm wie Microsoft Excel, Gnumeric oder LibreOffice, um sie zu lesen/schreiben.
import xlwt
style = xlwt.XFStyle()
style.num_format_str = '0.00E+00'
...
for i,n in enumerate(list1):
sheet1.write(i, 0, n, fmt)
CSV steht für durch Kommas getrennte Werte. CSV ist wie eine Textdatei und kann einfach durch Hinzufügen der Erweiterung .CSV erstellt werden.
zum Beispiel schreiben Sie diesen Code:
f = open('example.csv','w')
f.write("display,variable x")
f.close()
sie können diese Datei mit Excel öffnen.
import xlsxwriter
# Create an new Excel file and add a worksheet.
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet()
# Widen the first column to make the text clearer.
worksheet.set_column('A:A', 20)
# Add a bold format to use to highlight cells.
bold = workbook.add_format({'bold': True})
# Write some simple text.
worksheet.write('A1', 'Hello')
# Text with formatting.
worksheet.write('A2', 'World', bold)
# Write some numbers, with row/column notation.
worksheet.write(2, 0, 123)
worksheet.write(3, 0, 123.456)
# Insert an image.
worksheet.insert_image('B5', 'logo.png')
workbook.close()
Schauen Sie sich auch die folgenden Bibliotheken an:
xlwings - zum Abrufen von Daten in eine Tabellenkalkulation aus Python sowie zum Bearbeiten von Arbeitsmappen und Diagrammen
ExcelPython - Ein Excel-Add-In zum Schreiben von benutzerdefinierten Funktionen (UDFs) und Makros in Python anstelle von VBA
Ich habe ein paar Excel-Module für Python untersucht und festgestellt, dass openpyxl das Beste ist.
Das kostenlose Buch Automate the Boring Stuff mit Python enthält ein Kapitel über openpyxl mit mehr Details. Sie können auch die Seite Read the Docs besuchen. Sie benötigen kein Office oder Excel, um openpyxl verwenden zu können.
Ihr Programm würde ungefähr so aussehen:
import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
stimulusTimes = [1, 2, 3]
reactionTimes = [2.3, 5.1, 7.0]
for i in range(len(stimulusTimes)):
sheet['A' + str(i + 6)].value = stimulusTimes[i]
sheet['B' + str(i + 6)].value = reactionTimes[i]
wb.save('example.xlsx')
OpenPyxl
ist eine ziemlich schöne Bibliothek, die zum Lesen/Schreiben von Excel 2010 xlsx/xlsm-Dateien gedacht ist:
https://openpyxl.readthedocs.io/de/stable
Die andere Antwort , die sich darauf bezieht, verwendet die deperciated Funktion (get_sheet_by_name
). So machen Sie es ohne:
import openpyxl
wbkName = 'New.xlsx' #The file should be created before running the code.
wbk = openpyxl.load_workbook(wbkName)
wks = wbk['test1']
someValue = 1337
wks.cell(row=10, column=1).value = someValue
wbk.save(wbkName)
wbk.close
Der einfachste Weg, die genauen Zahlen zu importieren, ist das Hinzufügen einer Dezimalstelle nach den Zahlen in Ihrem l1
und l2
. Python interpretiert diesen Dezimalpunkt als Anweisung von Ihnen, die genaue Zahl anzugeben. Wenn Sie es auf eine Dezimalstelle beschränken müssen, sollten Sie in der Lage sein, einen Druckbefehl zu erstellen, der die Ausgabe einschränkt.
print variable_example[:13]
Der Befehl würde sich auf die zehnte Dezimalstelle beschränken, vorausgesetzt, Ihre Daten enthalten zwei Ganzzahlen, die von der Dezimalstelle übrig sind.
Sie können versuchen hfexcel Human Friendly objektorientierte python Bibliothek basierend auf XlsxWriter :
from hfexcel import HFExcel
hf_workbook = HFExcel.hf_workbook('example.xlsx', set_default_styles=False)
hf_workbook.add_style(
"headline",
{
"bold": 1,
"font_size": 14,
"font": "Arial",
"align": "center"
}
)
sheet1 = hf_workbook.add_sheet("sheet1", name="Example Sheet 1")
column1, _ = sheet1.add_column('headline', name='Column 1', width=2)
column1.add_row(data='Column 1 Row 1')
column1.add_row(data='Column 1 Row 2')
column2, _ = sheet1.add_column(name='Column 2')
column2.add_row(data='Column 2 Row 1')
column2.add_row(data='Column 2 Row 2')
column3, _ = sheet1.add_column(name='Column 3')
column3.add_row(data='Column 3 Row 1')
column3.add_row(data='Column 3 Row 2')
# In order to get a row with coordinates:
# sheet[column_index][row_index] => row
print(sheet1[1][1].data)
assert(sheet1[1][1].data == 'Column 2 Row 2')
hf_workbook.save()