Ich habe einen Pandas DataFrame, den ich in eine neue CSV-Datei hochladen möchte. Das Problem ist, dass ich die Datei nicht lokal speichern möchte, bevor ich sie auf s3 übertrage. Gibt es eine Methode wie to_csv, um den Datenrahmen direkt in s3 zu schreiben? Ich benutze boto3.
Folgendes habe ich bisher:
import boto3
s3 = boto3.client('s3', aws_access_key_id='key', aws_secret_access_key='secret_key')
read_file = s3.get_object(Bucket, Key)
df = pd.read_csv(read_file['Body'])
# Make alterations to DataFrame
# Then export DataFrame to CSV through direct transfer to s3
df.to_csv('s3://mybucket/dfs/somedf.csv')
. stackoverflow.com/a/56275519/908886 für weitere Informationen.Antworten:
Sie können verwenden:
quelle
TypeError: unicode argument expected, got 'str'
Fehler bei der VerwendungStringIO
. Ich habe verwendetBytesIO
und es hat einwandfrei funktioniert. Hinweis: Dies war in Python 2.7bucket
Objekt? Wie hast du das geschaffen?bucket
Hier speichern Sie Objekte in S3. Der Code setzt voraus, dass Sie bereits das Ziel (think: directory) erstellt haben, in dem dieses gespeichert werden soll. Siehe S3 docsSie können den S3-Pfad direkt verwenden. Ich benutze Pandas 0.24.1
Veröffentlichungshinweis:
quelle
NoCredentialsError: Unable to locate credentials
. Irgendwelche Vorschläge?NotImplementedError: Text mode not supported, use mode='wb' and manage bytes
. irgendwelche Vorschläge?Ich mag s3fs, mit dem Sie s3 (fast) wie ein lokales Dateisystem verwenden können.
Du kannst das:
s3fs
unterstützt nurrb
undwb
Modi zum Öffnen der Datei, deshalb habe ich diesesbytes_to_write
Zeug gemacht.quelle
s3fs
scheint den Append-Modus nicht zu unterstützen.Dies ist eine aktuellere Antwort:
Das Problem mit StringIO ist, dass es Ihr Gedächtnis auffrisst. Mit dieser Methode streamen Sie die Datei in s3, anstatt sie in einen String zu konvertieren, und schreiben sie dann in s3. Das Halten des Pandas-Datenrahmens und seiner Zeichenfolgenkopie im Speicher scheint sehr ineffizient zu sein.
Wenn Sie in einem ec2-Moment arbeiten, können Sie ihm eine IAM-Rolle zuweisen, damit er in s3 geschrieben werden kann. Sie müssen also keine Anmeldeinformationen direkt übergeben. Sie können jedoch auch eine Verbindung zu einem Bucket herstellen, indem Sie Anmeldeinformationen an die
S3FileSystem()
Funktion übergeben. Siehe Dokumentation: https://s3fs.readthedocs.io/en/latest/quelle
to_csv()
. scheint eine sauberere Implementierung.botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
... Ich habe sogar den Bucket PUBLIC READ erstellt und unter meinem IAM-Benutzer in der Bucket-Richtlinie die folgenden Aktionen hinzugefügt:"Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectAcl", "s3:DeleteObject" ]
def send_to_bucket(df, fn_out, bucketname): csv_buffer = StringIO(); df.to_csv(csv_buffer); s3_resource = boto3.resource('s3'); s3_resource.Object(bucketname, fn_out).put(Body=csv_buffer.getvalue());
Wenn Sie
None
als erstes Argument anto_csv()
die Daten übergeben, werden diese als Zeichenfolge zurückgegeben. Von dort aus ist es ein einfacher Schritt, das auf einmal in S3 hochzuladen.Es sollte auch möglich sein, ein
StringIO
Objekt an zu übergebento_csv()
, aber die Verwendung einer Zeichenfolge ist einfacher.quelle
None
zuto_csv()
und die zurückgegebene Zeichenfolge zu verwenden , als es ein zu erstellen , istStringIO
Objekt und liest dann die Daten wieder aus.Sie können auch den AWS Data Wrangler verwenden :
Beachten Sie, dass es in mehrere Teile aufgeteilt wird, da es parallel hochgeladen wird.
quelle
Ich fand, dass dies
client
auch mit und nicht nur möglich istresource
.quelle
boto3.client()
Versuchen Sie, da Sie verwenden :quelle
Ich habe eine sehr einfache Lösung gefunden, die zu funktionieren scheint:
Hoffentlich hilft das !
quelle
Ich habe eine CSV mit zwei Spalten aus Bucket S3 gelesen und den Inhalt der Datei CSV in Pandas Dataframe eingefügt.
Beispiel:
config.json
cls_config.json
cls_pandas.py
cls_s3.py
test.py
quelle