Lors de la génération d'un code QR et du renvoi avec l'API, etc. ou lors de l'envoi d'un e-mail Le processus d'enregistrement dans un fichier une fois et de lecture est inclus. Dans le cas de ce traitement, il y a des problèmes de vitesse dans les E / S et des problèmes lors du traitement parallèle.
Avec le module BytesIO
, vous pouvez générer une image en mémoire sans avoir à la cracher une seule fois dans un fichier.
Nécessite des bibliothèques qrcode et Pillow.
pip install qrcode pillow
from io import BytesIO
import base64
import qrcode
class QRImage():
@staticmethod
def to_bytes(text: str) -> bytes:
stream = BytesIO()
img = qrcode.make(text)
img.save(fp, "PNG")
stream.seek(0)
byte_img = stream.read()
stream.close()
return byte_img
@classmethod
def to_b64(cls, text: str) -> bytes:
byte = cls.to_bytes(text)
return base64.b64encode(byte).decode("utf-8")
if __name__ == "__main__":
binary = QRImage.to_bytes(text="some_text")
base64_encoded = QRImage.to_b64(text="some_text")
Générez simplement un flux binaire avec BytesIO ()
et créez, lisez et enregistrez comme un flux de fichiers.
StringIO etc. existent également et peuvent stocker des chaînes. Il prend également en charge la syntaxe with.
from io import StringIO
def main():
with StringIO() as fp:
fp.write("Hello")
print(fp.closed) # True
print(fp.getvalue()) # Hello
print(fp.closed) # False
main()
Disons adieu aux fichiers intermédiaires.
Recommended Posts