(Notes diverses) Modèle de mise à jour des données à partir de l'acquisition / traitement des données CSV par Python vers Excel

Que dois-je faire pour créer / mettre à jour une feuille Excel (A) et acquérir / traiter des données (CSV, etc.) à ajouter à cette feuille (B)?

A. Création / mise à jour des feuilles

introduction

Il existe les modèles de traitement suivants.

Généralement, c'est OK si vous utilisez la bibliothèque openpyxl (certaines autres bibliothèques sont plus rapides, mais elles ne prennent en charge que la lecture = vous ne pouvez pas écrire (mettre à jour) sur l'objet du classeur, etc. Il y a des restrictions).

1. Créer une feuille

1-1. Création d'un objet classeur (wb)

-① "Après avoir ajouté des données à l'objet, enregistrez-le sous un nom = créer un nouveau" Importer la bibliothèque

      from openpyxl import Workbook
      wb = Workbook()

-② "Lire un livre existant, ajouter des données, puis lui donner un nouveau nom = utiliser un modèle" -③ "Lire le livre existant, ajouter les données et lui donner le même nom = Mettre à jour la feuille existante"

      from openpyxl import Workbook
      wb = px.load_workbook(self.template_filepath)

1-2. Création d'objets de feuille de calcul (ws)

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

2. Préparation et ajout de données à ajouter à la feuille de calcul (décrit plus loin)

--2-1. Acquisition de données ―― 2-2. Traitement des données --2-3. Substituer les données de manière séquentielle dans des objets de feuille de calcul (wb / ws / cell) (Plus tard, spécifiez le nom de fichier de l'objet et enregistrez-le).

4. Enregistrer le classeur

Enregistrez les données ajoutées aux objets de feuille de calcul dans ce classeur dans le classeur réel.

--Pattern ③, si vous spécifiez un chemin de fichier existant --Si vous spécifiez un nouveau chemin de fichier, ce sera ① ou ②

wb.save(self.output_filepath)

B. Préparation et ajout de données à ajouter à la feuille de calcul

introduction

Les modèles de mise en œuvre incluent les éléments suivants

1. Obtenez des données

Il existe les modèles suivants comme cette méthode

-① Utilisation normale avec ouvert -② Utiliser une bibliothèque spécialisée pour le traitement de données à grande échelle

S'il y a des données supplémentaires dans les données ou si une agrégation est requise, un prétraitement est effectué avec cela. Dans cette bibliothèque, les données sont acquises à partir de CSV, etc. dans un format appelé trame de données. Les données acquises sous forme de trame de données se présentent sous une forme facile à agréger et à calculer. Si vous souhaitez simplement traiter les données acquises et les exporter au lieu de mettre à jour la feuille de calcul ou d'utiliser le fichier existant comme modèle, c'est tout ce dont vous avez besoin.

Notez que la mémoire est souvent un problème, alors reportez-vous à ce qui suit. https://www.sejuku.net/blog/74447 Autre lié https://qiita.com/gangun/items/f97c40f5540f8011c252

① Cas d'utilisation normal ouvert

Obtenez séquentiellement

wizh open(self.source_filepath, 'r', encoding='utf-8') as file:
    while True:
        line = file.readline()
        row = next(line) #Cela souffre de l'histoire de l'élément suivant
        ws.append(row) #C'est l'histoire de l'article suivant

--Comment ignorer la première ligne (colonne)

https://teratail.com/questions/107027

with open(self.source_filepath, 'r', encoding='utf-8') as file:
    next(file) 

(2) Cas d'utilisation d'une bibliothèque spécialisée dans le traitement des données

Le type de données obtenu en premier par cette méthode est appelé une trame de données. J'utilise habituellement des pandas. Il est rapide de lire les données avec dask. Le traitement parallèle de multiprossess semble être le meilleur. Cependant, c'est aussi dans cet ordre qu'il n'y a pas l'habitude de l'utiliser et qu'il est difficile de trébucher. Les détails tels que la méthode d'agrégation sont divers et sont fondamentalement omis. Notez qu'une erreur se produira si le traitement est effectué sans prêter attention au type de données.

(1) Bibliothèque d'importation

import pandas as pd / import dask as dd

(2) Obtenir des données

Vous pouvez obtenir des données de type dataframe à partir de la source de données avec le code ci-dessous

df = pd.read_csv(self.source_filepath ,encoding=self.source_file_encoding)
df = dd.read_excel(self.source_filepath ,encoding=self.source_file_encoding) 

--Remarque: Comment ignorer la première ligne (colonne)

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) 

Comme c'est un gros problème, j'ai également expérimenté un modèle différent pour la taille des morceaux de Pandas. À partir de la conclusion, le traitement s'est terminé le plus rapidement autour de la taille du morceau = 30 000 pour 10 millions de lignes. https://qiita.com/gangun/items/17155a8b59079e37b075

read_csv(self.source_filepath ,encoding=self.source_file_encoding, chunksize=30000) 

référence: https://qiita.com/hoto17296/items/586dc01aee69cd4915cc https://qiita.com/simonritchie/items/e174f243bc03fb25462e https://qiita.com/simonritchie/items/1ce3914eb5444d2157ac

--Cas pour obtenir des données à partir d'un objet classeur

référence: https://soudegesu.com/post/python/cell-excel-with-openpyxl/

· Lecture de lignes / colonnes


for col in ws.iter_cols(min_row=2):
    ...
for row in ws. iter_rows(min_row=2):
    ...

・ Acquisition d'unités cellulaires (Omis)

3. Ajouter des données à l'objet classeur

C'est la partie qui croise "A. Création / mise à jour d'une feuille". Parce qu'il est nécessaire d'ajouter les données acquises / traitées à l'objet feuille / cellule créé par OpenPyXl.

Les données ici incluent non seulement la valeur réelle de la cellule, mais également le type et le format des données (mise en page). Je ne ferai pas ici de note en détail. Lors de la recherche de ceux-ci, il existe de nombreuses explications telles que le traitement dans l'ordre ligne → cellule, ou même si une colonne est spécifiée, le traitement est finalement effectué en unités de cellule. Cependant, en ce qui concerne la mise en page, lorsqu'un classeur (modèle) existant est chargé avec OpenPyXl, il peut être possible de conserver entièrement le format d'origine si la mise en forme conditionnelle est définie sur la feuille. Cela permet, par exemple, de ne colorer que les lignes du sous-total.

for chunk in chunks:
  rows = chunk.values
  for row_data in rows_data:
    row_data = row_data.tolist()
    ws.append(row_data)

for i in dataframe_to_rows(df, index=False, header=True):
    ws.append(row)

--Cas de l'ajout d'unités cellulaires

Exemple 1 https://gist.github.com/bisco/a65e71c8ba45337f91174e6ae3c139f9

Exemple 2 Rupture de ligne dans la cellule https://www.relief.jp/docs/openpyxl-line-feed.html

ws['A1'].value = 'AAA\nBBB'
ws['A1'].alignment = openpyxl.styles.Alignment(wrapText=True)

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

--Lors de la récupération de données au format matriciel [[...], [...]] et de leur ajout ligne par ligne

for row in matrix:
  ws.append(row)

--Cas à ajouter dans une colonne spécifique

référence: 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)'
Traitement des cellules dans une colonne spécifique
          for row, cellObj in enumerate(list(ws.columns)[col_num]: #col_num:Index des colonnes
            n= '=vlookup(A%d,C:C,1,false)' %(row+1)
          cellObj.value = n
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()Est facultatif

Il y a encore des articles qui ont été utiles, je prévois donc de les ajouter pendant mon temps libre.

Recommended Posts

(Notes diverses) Modèle de mise à jour des données à partir de l'acquisition / traitement des données CSV par Python vers Excel
Envoyer des données de Python au traitement via une communication socket
Remarques sur l'importation de données depuis MySQL ou CSV avec Python
Récupérer les données souhaitées du site Web en liant Python et Excel
Météorologie x Python ~ De l'acquisition de données météorologiques à l'analyse spectrale ~
Mettre à jour Mac Python de 2 à 3
[Good By Excel] script python pour générer sql pour convertir csv en table
[Bases de la science des données] J'ai essayé d'enregistrer de csv à mysql avec python
Comment mettre à jour Google Sheets à partir de Python
Convertir des données Excel en JSON avec python
[Python] Un script utile pour le traitement Excel / csv
Python> Numéros de sortie de 1 à 100, 501 à 600> Pour csv
[Python] De l'analyse morphologique des données CSV à la sortie CSV et à l'affichage graphique [GiNZA]
Regroupez le nombre d'étapes par jour à partir des données de santé iPhone pour créer un fichier CSV
Modifier Excel à partir de Python pour créer un tableau croisé dynamique
[Python] Conversion de DICOM en PNG ou CSV
Importer un fichier Excel depuis Python (enregistré dans DB)
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
[Python] Flux du scraping Web à l'analyse des données
Écrire des données CSV sur AWS-S3 avec AWS-Lambda + Python
[Python] Suite - Convertir le texte PDF en CSV page par page
Traitement pleine largeur et demi-largeur des données CSV en Python
Comment récupérer des données d'image de Flickr avec Python
Manipuler des fichiers Excel à partir de python avec xlrd (mémo personnel)
[Python] Convertir le texte PDF en CSV pour chaque page (2/24 postscript)
Python - Remarques lors de la conversion du type str en type int
Comment enregistrer une table récupérée par python en csv
Traiter les données csv avec python (traitement du comptage à l'aide de pandas)
Script Python qui crée un fichier JSON à partir d'un fichier CSV
[Python / Ruby] Comprendre le code Comment obtenir des données en ligne et les écrire au format CSV
Traitement de la communication par Python
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
Exécutez Python à partir d'Excel
Premier mémo divers sur Python
Traitez d'énormes fichiers Excel avec Python pour améliorer la productivité
[Python] Essayez de classer les boutiques de ramen par traitement du langage naturel
Technique élégante pour coller des données CSV dans Excel avec Python
Introduction à Python pour les utilisateurs de VBA - Appeler Python depuis Excel avec xlwings -
Code Python pour l'écriture de données CSV dans le stockage d'objets DSX
Appuyez sur REST en Python pour obtenir des données de New Relic
[Introduction à Python] Combinaison des données Nikkei Average et NY Dow CSV
Un script python qui convertit les données Oracle Database en csv
Transmettez les données OpenCV de la bibliothèque C ++ d'origine à Python