web-dev-qa-db-fra.com

Python 3 et encodage base64 d'un fichier binaire

Je suis nouveau à Python et j'ai un problème qui me dérange.

J'utilise le code suivant pour obtenir une représentation sous forme de chaîne base64 de mon fichier Zip.

with open( "C:\\Users\\Mario\\Downloads\\exportTest1.Zip",'rb' ) as file:
    zipContents = file.read()
    encodedZip = base64.encodestring(zipContents)

Maintenant, si je génère la chaîne, elle est contenue dans une représentation b ''. Pour moi, ce n'est pas nécessaire et je voudrais l'éviter. Il ajoute également un caractère de nouvelle ligne tous les 76 caractères, ce qui est un autre problème. Existe-t-il un moyen d'obtenir le contenu binaire et de le représenter sans les caractères de nouvelle ligne et le b de fin et de début?

Juste pour comparaison, si je fais ce qui suit dans PowerShell:

$fileName = "C:\Users\Mario\Downloads\exportTest1.Zip"
$fileContentBytes = [System.IO.File]::ReadAllBytes($fileName)
$fileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes) 

J'obtiens la chaîne exacte que je recherche, pas de b '' et pas de\n tous les 76 caractères.

10
Mario Majcica

Depuis le base64 package doc:

base64.encodestring:

"Encode les objets de type octets, qui peuvent contenir des données binaires arbitraires, et renvoient bytes contenant les données encodées en base64, avec des retours à la ligne (b"\n") inséré après tous les 76 octets de sortie, et en veillant à ce qu'il y ait une nouvelle ligne de fin, conformément à la RFC 2045 (MIME). "

Vous souhaitez utiliser

base64.b64encode:

"Encode les objets de type octet en utilisant Base64 et retourne le bytes encodé."

Exemple:

import base64

with open("test.Zip", "rb") as f:
    encodedZip = base64.b64encode(f.read())
    print(encodedZip.decode())

La decode() convertira la chaîne binaire en texte.

17
Simon Kirsten

Utilisez b64encode Pour encoder sans les sauts de ligne, puis décodez la chaîne binaire résultante avec .decode('ascii') pour obtenir une chaîne normale.

encodedZip = base64.b64encode(zipContents).decode('ascii')
8
gre_gor