[PYTHON] Erstellen Sie eine CP932-CSV-Datei für Excel mit Chalice und geben Sie sie zurück

Einführung

Beim Erstellen eines Webanwendungsverwaltungssystems tritt häufig das Muster "Ich möchte, dass Sie Systemdaten in eine CSV-Datei herunterladen können, die in Excel geöffnet werden kann" auf. Wenn Sie eine CSV erstellen, ohne an Python3 zu denken, handelt es sich um eine UTF-8-Zeichencodierung. Wenn dies die Standardeinstellung von Excel ist, werden die Zeichen verstümmelt. Wenn Sie die Lesekodierung in Excel richtig angeben, können Sie sie natürlich problemlos öffnen, aber es wird oft gesagt, dass "ich das nicht verstehe, also nicht von Anfang an verstümmeln". In diesem Fall muss eine CSV-Datei mit der Codierung für Windows (CP932 oder Shift_JIS, SJIS) erstellt werden.

Diesmal habe ich Chalice verwendet, aber als ich mir das Dokument genau angesehen habe, bin ich festgefahren und habe mir eine Notiz gemacht.

Version etc.

$ pipenv run chalice --version
chalice 1.21.2, python 3.8.2, linux 5.4.0-52-generic

Lesen Sie die Dokumentation

Dieses Mal möchte ich es mit Response zurückgeben, daher dachte ich, dass es möglich wäre, wenn ich einen geeigneten Wert in den Hauptteil der Response-Klasse einfügen würde. In dem Dokument zum Zeitpunkt des Schreibens des Artikels (23. Oktober 2020) heißt es jedoch:

class Response(body, headers=None, status_code=200) body: The HTTP response body to send back. This value must be a string.

Zitiert und Auszug aus https://aws.github.io/chalice/api.html#response. Teilweise betont.

Denken beim Lesen.

"Eh ...? Die in CP932 codierte Zeichenfolge ist ein Bytetyp, daher kann ich sie hier nicht übergeben ...? Wenn dies nicht möglich ist, erstellen Sie eine Datei, laden Sie sie in S3 hoch und lassen Sie sie herunterladen ..."

** body kann jedoch auch dann übergeben werden, wenn Bytes eingegeben werden **. Es scheint, dass der "String" in diesem Dokument für einen breiteren String als nur den "Str-Typ" gedacht ist. Als ich es noch einmal nachschlug, stellte mir eine Person mit derselben Frage eine Frage.

Implementierungsbeispiel: Direkte Antwort

Sie können auch den Typ ** Bytes ** an Chalices Response # body ** übergeben. Wenn Sie es darauf basierend implementieren, sieht es so aus. Wenn Sie mit einem Browser auf / zugreifen, wird es als CSV-Datei heruntergeladen.

app.py


#!/usr/bin/python
# -*- coding: utf-8 -*-

import csv
import tempfile

from chalice import Chalice, Response

app = Chalice(app_name='csvtest')


def csv_response(filename, encoding='utf8'):
    """So geben Sie eine CSV-Datei zurück 1:Direkte Antwort"""
    with tempfile.TemporaryFile(mode='r+', encoding=encoding) as fh:
        #Schreiben Sie mit dem Schriftsteller
        writer = csv.writer(fh, lineterminator='\r\n')
        writer.writerow(['Nutzername', 'Datum und Uhrzeit der Anmeldung'])
        writer.writerow(['user01', '2000/01/01 00:00:00'])
        #Lesen Sie alle geschriebenen Daten in Daten
        fh.seek(0)
        data = fh.read()
    headers = {}
    headers['Content-Type'] = 'text/csv'
    headers['Content-Disposition'] = f'attachment;filename="{filename}"'
    return Response(body=data, status_code=200, headers=headers)


@app.route('/')
def index():
    return csv_response('test.csv', encoding='cp932')

Alternative: Laden Sie Dateien in S3 hoch

Im vorherigen Beispiel wird "tmpfile" verwendet, um eine Datei im Speicher zu erstellen, und dann wird "data" gelesen. Im Fall von AWS Lambda wird es jedoch in einer Umgebung ausgeführt, in der die Speichernutzung begrenzt ist. Wenn die Datei also groß wird, kann davon ausgegangen werden, dass die Speichernutzung erheblich beeinträchtigt wird. Natürlich ist dies ein Problem, das vermieden werden kann, indem die Obergrenze der Speichernutzung angehoben wird. Wenn sich die Gebühr jedoch verdoppelt, können Sie zögern. In diesem Fall können Sie vorübergehend eine Datei unter "/ tmp" erstellen, die von AWS Lambda bereitgestellt wird, und die erstellte Datei in S3 hochladen. Nach dem Hochladen auf S3 können Sie über die Kommunikation von CloudFront --S3 auf die erstellte Datei zugreifen oder eine temporäre URL erstellen und bereitstellen, über die der Benutzer sie herunterladen kann.

Beachten Sie, dass "TempfileContext" nicht die Essenz des Codes ist, da er so vorbereitet ist, dass die in AWS Lambda verwendeten Dateien unter "/ tmp" gelöscht werden können, ohne die Fehlerbehandlung zu berücksichtigen.

import os
import csv
import uuid

import boto3

s3 = boto3.client('s3')


class TempfileContext:
    """Bietet einen Kontext zum Erstellen und Löschen temporärer Dateien"""
    def __init__(self):
        tmpfile = str(uuid.uuid4())
        self.filename = f'/tmp/{tmpfile}'

    def __enter__(self):
        return self

    def __exit__(self, ex_type, ex_value, trace):
        try:
            if os.path.exists(self.filename):
                os.remove(self.filename)
        except Exception:
            pass


def create_and_upload_csv(filename, encoding='utf8'):
    """So geben Sie eine CSV-Datei zurück 2:Erstellen Sie eine CSV und laden Sie sie in S3 hoch"""
    with TempfileContext() as tmp:
        # 1. /Erstellen Sie eine CSV-Datei im Bereich tmp
        with open(tmp.filename, 'w', encoding=encoding) as fh:
            #Schreiben Sie mit dem Schriftsteller
            writer = csv.writer(fh, lineterminator='\n')
            writer.writerow(['Nutzername', 'Datum und Uhrzeit der Anmeldung'])
            writer.writerow(['user01', '2000/01/01 00:00:00'])

        # 2.Auf S3 hochladen
        s3.upload_file(tmp.filename, BUCKETNAME, f'uploads/{filename}')

Recommended Posts

Erstellen Sie eine CP932-CSV-Datei für Excel mit Chalice und geben Sie sie zurück
Erstellen Sie eine temporäre Datei mit Django als Zip und geben Sie sie zurück
Erstellen Sie mit Django einen Datei-Uploader
Erstellen Sie eine gestreifte Illusion mit Gammakorrektur für Python3 und openCV3
Erstellen Sie schnell eine Excel-Datei mit Python #python
Erstellen Sie eine große Textdatei mit Shellscript
VM mit YAML-Datei (KVM) erstellen
Erstellen Sie eine Excel-Datei mit Python + Ähnlichkeitsmatrix
Lesen und formatieren Sie CSV-Dateien gemischt mit Komma-Registerkarten mit Python-Pandas
Lesen einer CSV-Datei mit Python 2/3
Erstellen Sie eine mit tkinter erstellte ausführbare GUI-Datei
Erstellen Sie mit Minette für Python einen LINE BOT
Erstellen Sie eine PDF-Datei mit einer zufälligen Seitengröße
Erstellen Sie mit Django ein Dashboard für Netzwerkgeräte!
Machen Sie einen Zylinder mit open3d + STL-Dateiausgabe
Erstellen wir ein einfaches Empfangssystem mit dem serverlosen Python-Framework Chalice und Twilio
Erstellen Sie eine saubere Datenbank zum Testen mit FastAPI und führen Sie Unittest of API mit pytest aus
Erstellen Sie mit Py2app und Tkinter eine native GUI-App
Erstellen Sie einen Stapel von Bildern und blasen Sie sie mit ImageDataGenerator auf
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
Erstellen Sie mit PyQt5 und PyQtGraph einen 3D-Modell-Viewer
Python-Skript, das eine JSON-Datei aus einer CSV-Datei erstellt
[Python] Erstellen Sie mit cx_Freeze eine Verteilungsdatei für das Tkinter-Programm
Erstellen Sie eine 2D-CAD-Datei ".dxf" mit Python [ezdxf]
[Linux] Erstellen Sie ein Selbstzertifikat mit Docker und Apache
Erstellen Sie mit Google Text To Speak eine Audiodatei mit der Text-to-Speech-Funktion und überprüfen Sie den Text 3 Minuten lang als Leitfaden für das Sprechen.
Analysieren Sie die Researchmap-API mit Python und erstellen Sie automatisch eine Word-Datei für die Leistungsliste
Erstellen Sie eine neue CSV mit Pandas basierend auf der lokalen CSV
[Python] Erstellen Sie mit tkinter einen Bildschirm zur Datei- und Ordnerpfadspezifikation
Erstellen Sie eine WEB-Überwachungskamera mit Raspberry Pi und OpenCV
[Python] Lesen Sie die CSV-Datei und zeigen Sie die Abbildung mit matplotlib an
[Python] Erstellen Sie eine Datums- und Zeitliste für einen bestimmten Zeitraum
Erstellen Sie Anwendungen, registrieren Sie Daten und teilen Sie sie mit einer einzigen E-Mail
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
Installationsverfahren für Python und Ansible mit einer bestimmten Version
Stilvolle Technik zum Einfügen von CSV-Daten in Excel mit Python
Erstellen Sie ein Bereitstellungsskript mit Stoff und Küche und verwenden Sie es erneut
Bibliothek zur Angabe eines Nameservers in Python und Dig
Erstellen Sie mit Django eine API für die soziale Integration von Smartphone-Apps
[Python] Erstellen Sie mit Django einen Bildschirm für den HTTP-Statuscode 403/404/500
Bei mir cp und Subprocess
CSV-Datei lesen und schreiben
Erstellen Sie eine Homepage mit Django
Dateien lesen und schreiben
Erstellen Sie eine Dummy-Datendatei
Dateien schreiben und lesen
Erstellen Sie ein Verzeichnis mit Python
Erstellen Sie eine Xlsx-Datei mit XlsxWriter
Erstellen Sie eine Windows Python-Ausführungsumgebung mit VScode + Remote WSL
So fügen Sie eine CSV-Datei mit Pandas in eine Excel-Datei ein
Lassen Sie uns mit Pylearn2 eine Drei-Wege-KI erstellen - Modell speichern und laden -
Erstellen Sie mit Python + Qt (PySide) einen Farbwähler für das Farbrad.
So erstellen Sie eine Bezeichnung (Maske) für die Segmentierung mit labelme (semantische Segmentierungsmaske)
Erstellen Sie mit BigQuery ein privates DMP ohne Anfangskosten und ohne Entwicklung
Ich habe versucht, Bulls and Cows mit einem Shell-Programm zu erstellen
[Für Anfänger] Lesen Sie Excel / CSV-Dateien mit Google Colaboratory in DataFrame