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)

  • Verwenden Sie Amazon s3 boto Bibliothek, wie bekomme ich die URL eines gespeicherten Schlüssels?
  • Wie man s3 Eimer öffentlich in Python macht
  • Verwenden von boto für AWS S3 Buckets für Signatur V4
  • Hochladen des Bildes bei öffentlicher URL zu S3 mit boto
  • Python / Boto 3: Wie kann ich Dateien von AWS S3 abrufen / herunterladen?
  • Direkter Upload auf S3 mit Python / Boto / Django, um die Richtlinie zu konstruieren
  • 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?

  • Den längsten Teilstring in alphabetischer Reihenfolge finden
  • Python Recursive Funktion fehlende Ergebnisse
  • Ich versuche, eine Funktion zu machen, die max aus verschachtelter Liste zurückgibt?
  • Python Recursive Funktion für Collatz Conjecture
  • Python recursion return Keine Typ
  • Python-Rekursions-Permutationen
  • 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.