S3-Datei auf lokal mit luigi hebt UnicodeDecodeError

Ich kopiere eine pdf Datei auf lokal, mit dem folgenden Code:

 with self.input_target().open('r') as r: with self.output_target().open('w') as w: for line in r: w.write(line) 

Das ist in dieser Frage (Art von)

  • Hochladen des Bildes bei öffentlicher URL zu S3 mit boto
  • Es ist nicht möglich, ahs s3 bucket mit boto zu verbinden
  • Wie kann ich Dateien kopieren, die größer als 5 GB in Amazon S3 sind?
  • Schnellste Weg, um 3 Millionen Objekte aus einem S3-Eimer herunterzuladen
  • Boto3 zum Herunterladen aller Dateien aus einem S3 Bucket
  • Verwenden von boto für AWS S3 Buckets für Signatur V4
  • Aber wenn ich diesen Code ausführe, bekomme ich folgendes:

     UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 11: invalid continuation byte 

    Ich habe diesen anderen Ansatz versucht, ohne gute Ergebnisse:

      with self.input_target().open('r') as r, self.output_target().open('w') as w: w.write(r.read()) 

    Was ist der richtige Weg, es zu tun?

  • Refactoring zur Beseitigung der globalen Variablen in rekursiver Funktion
  • Refactoring rekursive "Vorkommen von" Funktion
  • Python leer dict nicht durch Verweis übergeben?
  • Zählen der Rekursion in einem Python-Programm!
  • Rekursive dircmp (vergleiche zwei Verzeichnisse, um sicherzustellen, dass sie die gleichen Dateien und Unterverzeichnisse haben)
  • Finde alle Index mit Rekursion
  • 2 Solutions collect form web for “S3-Datei auf lokal mit luigi hebt UnicodeDecodeError”

    Es scheint, dass es sich um eine Binärdatei handelt, als ob es Text wäre – aber das ist nicht. Wahrscheinlich musst du so etwas machen:

     with self.input().open('r') as i, self.output().open('w') as o: o.write(i.read()) 

    (nicht getestet!)

    Auch ich glaube, Sie können diese Antwort nützlich finden: Python schriftlich binäre Dateien, Bytes

    Ich beendete mit luigi.s3.S3Client und die Methode get die eine Binärdatei von / auf die s3 kopiert.

    Codeausschnitt:

    Import luigi

     class ATask(luigi.Task): s3_path = luigi.Parameter() local_path = luigi.Parameter() ... def run(self): client = luigi.s3.S3Client() client.get(s3_path, local_path) ## This gets the file ... 

    Ich denke, dass der zugrunde liegende Grund ist, dass luigi verwendet boto für das Erhalten / Putting von Dateien von / auf die s3 . (Wie Sie im Quellcode sehen können)

    Python ist die beste Programmiersprache der Welt.