(Sonstige Hinweise) Datenaktualisierungsmuster von der CSV-Datenerfassung / -verarbeitung durch Python nach Excel

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?

A. Erstellen / Aktualisieren von Arbeitsblättern

Einführung

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).

1. Erstellen eines Blattes

1-1. Erstellen eines Arbeitsmappenobjekts (wb)

-① "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)

1-2. Erstellen von Arbeitsblattobjekten (ws)

      ws = wb.worksheets[sheetnum] / wb.worksheets[self.sheetname] 

2. Vorbereiten und Hinzufügen von Daten, die dem Arbeitsblatt hinzugefügt werden sollen (später beschrieben)

--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).

4. Speichern Sie die Arbeitsmappe

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)

B. Vorbereiten und Hinzufügen von Daten, die dem Arbeitsblatt hinzugefügt werden sollen

Einführung

Die Implementierungsmuster umfassen Folgendes

1. Daten abrufen

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

① Bei normaler Öffnung

Holen Sie sich nacheinander

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) 

(2) Fall der Verwendung einer auf Datenverarbeitung spezialisierten Bibliothek

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.

(1) Bibliothek importieren

import pandas as pd / import dask as dd

(2) Daten abrufen

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)

3. Fügen Sie dem Arbeitsmappenobjekt Daten hinzu

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

(Sonstige Hinweise) Datenaktualisierungsmuster von der CSV-Datenerfassung / -verarbeitung durch Python nach Excel
Senden Sie Daten von Python über die Socket-Kommunikation an Processing
Hinweise zum Importieren von Daten aus MySQL oder CSV mit Python
Scrapen der gewünschten Daten von der Website durch Verknüpfen von Python und Excel
Meteorologie x Python ~ Von der Wetterdatenerfassung bis zur Spektrumanalyse ~
Aktualisieren Sie Mac Python von 2 auf 3
[Good By Excel] Python-Skript zum Generieren von SQL zum Konvertieren von CSV in Tabelle
[Data Science-Grundlagen] Ich habe versucht, mit Python von CSV auf MySQL zu speichern
So aktualisieren Sie Google Sheets von Python
Konvertieren Sie Excel-Daten mit Python in JSON
[Python] Ein Skript, das für die Excel / CSV-Verarbeitung nützlich ist
Python> Ausgaben von 1 bis 100, 501 bis 600> Für CSV
[Python] Von der morphologischen Analyse von CSV-Daten bis zur CSV-Ausgabe und Diagrammanzeige [GiNZA]
Aggregieren Sie die Anzahl der Schritte pro Tag aus den iPhone-Gesundheitsdaten, um eine CSV-Datei zu erstellen
Bearbeiten Sie Excel in Python, um eine Pivot-Tabelle zu erstellen
[Python] Konvertieren von DICOM in PNG oder CSV
Excel-Datei aus Python importieren (in DB registriert)
[Python] Lesen von Daten aus CIFAR-10 und CIFAR-100
[Python] Fluss vom Web-Scraping zur Datenanalyse
Schreiben Sie CSV-Daten mit AWS-Lambda + Python in AWS-S3
[Python] Fortsetzung - Konvertieren Sie PDF-Text Seite für Seite in CSV
Verarbeitung von CSV-Daten in voller und halber Breite in Python
So kratzen Sie Bilddaten von Flickr mit Python
Bearbeiten Sie Excel-Dateien aus Python mit xlrd (persönliches Memo)
[Python] Konvertiert PDF-Text für jede Seite in CSV (2/24 Postscript)
Python - Hinweise beim Konvertieren vom Typ str in den Typ int
So speichern Sie eine von Python gekratzte Tabelle in CSV
Verarbeiten Sie CSV-Daten mit Python (Zählverarbeitung mit Pandas)
Python-Skript, das eine JSON-Datei aus einer CSV-Datei erstellt
[Python / Ruby] Mit Code verstehen Wie man Daten aus dem Internet abruft und in CSV schreibt
Kommunikationsverarbeitung durch Python
Änderungen von Python 3.0 zu Python 3.5
Änderungen von Python 2 zu Python 3.0
Führen Sie Python aus Excel aus
Erstes Python-Memo
Verarbeiten Sie große Excel-Dateien mit Python, um die Produktivität zu verbessern
[Python] Versuchen Sie, Ramen-Shops durch Verarbeitung natürlicher Sprache zu klassifizieren
Stilvolle Technik zum Einfügen von CSV-Daten in Excel mit Python
Einführung in Python für VBA-Benutzer - Aufrufen von Python aus Excel mit xlwings-
Python-Code zum Schreiben von CSV-Daten in den DSX-Objektspeicher
Drücken Sie in Python auf REST, um Daten von New Relic abzurufen
[Einführung in Python] Kombinieren Sie Nikkei-Durchschnitts- und NY Dow-CSV-Daten
Ein Python-Skript, das Oracle-Datenbankdaten in CSV konvertiert
Übergeben Sie die OpenCV-Daten der ursprünglichen C ++ - Bibliothek an Python