Was tun mit dem Erstellen / Aktualisieren einer Excel-Tabelle (A) und dem Erfassen / Verarbeiten von Daten (CSV usw.), die dieser Tabelle (B) hinzugefügt werden sollen?
Es gibt die folgenden Verarbeitungsmuster.
Im Allgemeinen ist es in Ordnung, wenn Sie die openpyxl-Bibliothek verwenden (einige andere Bibliotheken sind schneller, aber nur lesbar = Sie können nicht in das Objekt der Arbeitsmappe usw. schreiben (aktualisieren) usw. Es gibt Einschränkungen).
-① "Nachdem Sie dem Objekt Daten hinzugefügt haben, speichern Sie diese als Namen = neu erstellen" Bibliothek importieren
from openpyxl import Workbook
wb = Workbook()
-② "Lesen Sie ein vorhandenes Buch, fügen Sie Daten hinzu und geben Sie ihm einen neuen Namen = Vorlage verwenden" -③ "Lesen Sie das vorhandene Buch, fügen Sie die Daten hinzu und geben Sie ihm den gleichen Namen = Aktualisieren Sie das vorhandene Blatt."
from openpyxl import Workbook
wb = px.load_workbook(self.template_filepath)
ws = wb.worksheets[sheetnum] / wb.worksheets[self.sheetname]
--2-1. Datenerfassung ―― 2-2. Datenverarbeitung --2-3. Daten nacheinander in Arbeitsblattobjekte (wb / ws / cell) einsetzen (Geben Sie später den Dateinamen für das Objekt an und speichern Sie es tatsächlich).
Speichern Sie die Daten, die zu den Arbeitsblattobjekten in dieser Arbeitsmappe hinzugefügt wurden, in der tatsächlichen Arbeitsmappe.
--Pattern ③, wenn Sie einen vorhandenen Dateipfad angeben
wb.save(self.output_filepath)
Die Implementierungsmuster umfassen Folgendes
Bei dieser Methode gibt es die folgenden Muster
-① Normal mit offenem verwenden -② Verwenden Sie eine Bibliothek, die auf die Verarbeitung großer Datenmengen spezialisiert ist
Wenn die Daten zusätzliche Daten enthalten oder eine Aggregation erforderlich ist, wird damit eine Vorverarbeitung durchgeführt. In dieser Bibliothek werden Daten von CSV usw. in einem Format erfasst, das als Datenrahmen bezeichnet wird. Die als Datenrahmen erfassten Daten liegen in einer Form vor, die leicht zu aggregieren und zu berechnen ist. Wenn Sie nur die erfassten Daten verarbeiten und exportieren möchten, anstatt das Arbeitsblatt zu aktualisieren oder die vorhandene Datei als Vorlage zu verwenden, ist dies alles, was Sie benötigen.
Beachten Sie, dass der Speicher häufig ein Problem darstellt. Beachten Sie daher die folgenden Punkte. https://www.sejuku.net/blog/74447 Andere verwandte https://qiita.com/gangun/items/f97c40f5540f8011c252
wizh open(self.source_filepath, 'r', encoding='utf-8') as file:
while True:
line = file.readline()
row = next(line) #Dies leidet unter der Geschichte des nächsten Artikels
ws.append(row) #Dies ist die Geschichte des nächsten Artikels
https://teratail.com/questions/107027
with open(self.source_filepath, 'r', encoding='utf-8') as file:
next(file)
Der Datentyp, der zuerst durch dieses Verfahren erhalten wird, wird als Datenrahmen bezeichnet. Normalerweise benutze ich Pandas. Es ist schnell, die Daten mit dask zu lesen. Die parallele Verarbeitung von Multiprossess scheint die beste zu sein. Es ist jedoch auch in dieser Reihenfolge, dass es keine Gewohnheit gibt, es zu benutzen, und es ist schwer zu stolpern. Details wie die Aggregationsmethode sind vielfältig und werden grundsätzlich weggelassen. Beachten Sie, dass ein Fehler auftritt, wenn die Verarbeitung ohne Berücksichtigung des Datentyps durchgeführt wird.
import pandas as pd / import dask as dd
Mit dem folgenden Code können Sie Daten vom Typ Datenrahmen aus der Datenquelle abrufen
df = pd.read_csv(self.source_filepath ,encoding=self.source_file_encoding)
df = dd.read_excel(self.source_filepath ,encoding=self.source_file_encoding)
--Hinweis: So überspringen Sie die erste Zeile (Spalte)
We can use the header and skiprows option to tell Pandas not to use the column labels already in our spreadsheet. Note that both header=None and skiprows=1 must be set in this case, as the first row of actual data will be skipped if the header option is missing. https://wellsr.com/python/python-pandas-read_excel-to-import-excel-file-into-dataframe/
read_csv(self.source_filepath ,encoding=self.source_file_encoding, header=None, skiprows=1)
Da es eine große Sache ist, habe ich auch mit einem anderen Muster für die Blockgröße von Pandas experimentiert. Aus der Schlussfolgerung geht hervor, dass die Verarbeitung bei einer Blockgröße von 30.000 für 10 Millionen Zeilen am schnellsten abgeschlossen wurde. https://qiita.com/gangun/items/17155a8b59079e37b075
read_csv(self.source_filepath ,encoding=self.source_file_encoding, chunksize=30000)
Referenz: https://qiita.com/hoto17296/items/586dc01aee69cd4915cc https://qiita.com/simonritchie/items/e174f243bc03fb25462e https://qiita.com/simonritchie/items/1ce3914eb5444d2157ac
--Fall, um Daten vom Arbeitsmappenobjekt abzurufen
Referenz: https://soudegesu.com/post/python/cell-excel-with-openpyxl/
· Zeilen- / Spaltenlesung
for col in ws.iter_cols(min_row=2):
...
for row in ws. iter_rows(min_row=2):
...
・ Erfassung der Zelleneinheit (Weggelassen)
Dies ist der Teil, der sich mit "A. Erstellen / Aktualisieren eines Blattes" überschneidet. Weil es notwendig ist, die erfassten / verarbeiteten Daten zu dem von OpenPyXl erstellten Blatt- / Zellenobjekt hinzuzufügen.
Die Daten hier enthalten nicht nur den tatsächlichen Zellenwert, sondern auch den Datentyp und das Format (Layout). Ich werde hier nicht im Detail darauf eingehen. Bei der Suche nach diesen gibt es viele Erklärungen, z. B. die Verarbeitung in der Reihenfolge Zeile → Zelle, oder selbst wenn eine Spalte angegeben wird, wird die Verarbeitung schließlich in Zelleneinheiten durchgeführt. In Bezug auf das Layout kann es jedoch möglich sein, das ursprüngliche Format vollständig beizubehalten, wenn eine vorhandene Arbeitsmappe (Vorlage) mit OpenPyXl geladen wird, wenn auf dem Blatt eine bedingte Formatierung festgelegt ist. So können beispielsweise nur die Zwischensummenlinien eingefärbt werden.
--Fall, in dem Daten im Chunk-Typ erfasst werden, Daten jedoch zeilenweise hinzugefügt werden
for chunk in chunks:
rows = chunk.values
for row_data in rows_data:
row_data = row_data.tolist()
ws.append(row_data)
--Fall, in dem Daten im Datenrahmentyp erfasst und zeilenweise hinzugefügt werden
for i in dataframe_to_rows(df, index=False, header=True):
ws.append(row)
Beispiel 1 https://gist.github.com/bisco/a65e71c8ba45337f91174e6ae3c139f9
Beispiel 2 Zeilenumbruch in der Zelle https://www.relief.jp/docs/openpyxl-line-feed.html
ws['A1'].value = 'AAA\nBBB'
ws['A1'].alignment = openpyxl.styles.Alignment(wrapText=True)
Beispiel 3
rows_data = df.values.tolist()
for i, row_data in enumerate(rows_data):
for j, cell_data in enumerate(row_data):
if type(cell_data) is int:
ws.cell(row=i+1, column=j+1).number_format = '#'#currentFormat
ws.append(row_data)
--Wenn Sie Daten im Matrixformat "[...], [...]]" abrufen und zeilenweise hinzufügen
for row in matrix:
ws.append(row)
--Fall zum Hinzufügen in einer bestimmten Spalte
Referenz: https://medium.com/ns%E9%9B%91%E8%A8%98%E5%B8%B3/6-%E5%88%97%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E6%95%B0%E5%BC%8F%E3%82%92fill%E3%81%99%E3%82%8B-9ce61f29baa8
ws['B2'] = '=vlookup(A2,C:C,1,false)'
Verarbeitung von Zellen in einer bestimmten Spalte
for row, cellObj in enumerate(list(ws.columns)[col_num]: #col_num:Spaltenindex
n= '=vlookup(A%d,C:C,1,false)' %(row+1)
cellObj.value = n
--Wenn der Datenrahmen unverändert ausgegeben wird (Neuerstellung oder Aktualisierung überschreiben)
df.reset_index().to_csv(self.output_filepath, encoding=self.output_file_encoding, index=False)
df.reset_index().to_excel(self.output_filepath, encoding=self.output_file_encoding, index=False)
#reset_index()Es ist optional
Es gibt immer noch Artikel, die hilfreich waren, daher plane ich, sie in meiner Freizeit hinzuzufügen.
Recommended Posts