2016-07-01 4 views
18

새로운 CVS 파일에 업로드하려는 pandas DataFrame이 있습니다. 문제는 s3으로 파일을 전송하기 전에 파일을 로컬에 저장하지 않기를 바랍니다. 직접 s3 데이터 프레임을 쓰는 to_csv 같은 메서드가 있습니까? 나는 boto3을 사용하고있다.Dataframe을 c3v로 직접 저장합니다. Python

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 

답변

7

당신이 데이터를 문자열로 반환됩니다 to_csv()에 첫 번째 인수로 None을 전달하는 경우 : 여기
는 내가 지금까지 가지고있는 것입니다. 거기에서 그것을 한 번에 S3에 업로드하는 쉬운 단계입니다.

StringIO 개체를 to_csv()으로 전달할 수도 있지만 문자열을 사용하면 더 쉬울 것입니다.

+0

하는 방법으로 쉽게 될 것인가? 올바른 방법은 무엇입니까? –

+0

@EranMoshe : 어느 쪽이든 올바르게 작동하지만 분명히 to_csv()에'None'을 전달하고 반환 된 문자열을 사용하는 것이'StringIO' 객체를 생성 한 다음 다시 데이터를 읽는 것이 더 쉽습니다. – mhawke

+0

내가 한 일에 게으른 프로그래머로서. 그리고 적은 코드를 작성하는 프로그래머가 더 쉽게 사용할 수 있습니다.> –

21

당신은 사용할 수 있습니다

from io import StringIO 
import boto3 

csv_buffer = StringIO() 
df.to_csv(csv_buffer) 
s3_resource = boto3.resource('s3') 
s3_resource.Object(bucket, 'df.csv').put(Body=csv_buffer.getvalue()) 
+0

from io import StringIO, 6 문자 미만의 편집을 허용하지 않는 것 같습니다. – Satyadev

+0

큰 파일 인 경우 메모리에 어떤 영향을 미치는지 ...? – citynorman

+0

파일이 크면 사용할 수있는 RAM이 더 크고 작업이 실패하고 예외 (예외를 알 수 없음)를 제외합니다. 이것은 대답으로 받아 들여야합니다 –

0
import boto3 

    s3_client = boto3.client('s3',aws_access_key_id="AccessKey",aws_secret_access_key="Secretkey") 

    head_response = s3_client.head_object(Bucket='YourBucket',Key='YourPath') 

    if head_response['HTTPStatusCode'] == 200: 
      Your operation if file exsits 
14

내가 로컬 파일 시스템과 같은 (S3)을 (거의) 사용할 수 있습니다 s3fs을 좋아합니다.

이 작업을 수행 할 수 있습니다

import s3fs 

bytes_to_write = df.to_csv(None).encode() 
fs = s3fs.S3FileSystem(key=key, secret=secret) 
with fs.open('s3://bucket/path/to/file.csv', 'wb') as f: 
    f.write(bytes_to_write) 

s3fs이 파일을 여는의 rbwb 모드를 지원, 나는이 bytes_to_write 물건을 한 이유가 있습니다.

+0

에있었습니다! 동일한 s3fs 모듈을 사용하여 파일 URL을 가져 오는 방법은 무엇입니까? –

+0

@ M.Zaman, 네가 무엇을 요구하는지 모르겠다. – michcio1234

+0

필자는 서면 파일을 다운로드 할 수있는 URL을 찾고 있었지만, 어쨌든 S3FileSystem을 통해 그 URL을 얻습니다. 감사합니다 –

0

버킷 s3의 두 열과 팬더 데이터 프레임에 넣은 파일 csv i의 내용으로 csv를 읽습니다.

예 :

config.json

{ 
    "credential": { 
    "access_key":"xxxxxx", 
    "secret_key":"xxxxxx" 
} 
, 
"s3":{ 
     "bucket":"mybucket", 
     "key":"csv/user.csv" 
    } 
} 

cls_config.json

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import os 
import json 

class cls_config(object): 

    def __init__(self,filename): 

     self.filename = filename 


    def getConfig(self): 

     fileName = os.path.join(os.path.dirname(__file__), self.filename) 
     with open(fileName) as f: 
     config = json.load(f) 
     return config 

cls_pandas.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import pandas as pd 
import io 

class cls_pandas(object): 

    def __init__(self): 
     pass 

    def read(self,stream): 

     df = pd.read_csv(io.StringIO(stream), sep = ",") 
     return df 

cls_s3.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import boto3 
import json 

class cls_s3(object): 

    def __init__(self,access_key,secret_key): 

     self.s3 = boto3.client('s3', aws_access_key_id=access_key, aws_secret_access_key=secret_key) 

    def getObject(self,bucket,key): 

     read_file = self.s3.get_object(Bucket=bucket, Key=key) 
     body = read_file['Body'].read().decode('utf-8') 
     return body 

test.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from cls_config import * 
from cls_s3 import * 
from cls_pandas import * 

class test(object): 

    def __init__(self): 
     self.conf = cls_config('config.json') 

    def process(self): 

     conf = self.conf.getConfig() 

     bucket = conf['s3']['bucket'] 
     key = conf['s3']['key'] 

     access_key = conf['credential']['access_key'] 
     secret_key = conf['credential']['secret_key'] 

     s3 = cls_s3(access_key,secret_key) 
     ob = s3.getObject(bucket,key) 

     pa = cls_pandas() 
     df = pa.read(ob) 

     print df 

if __name__ == '__main__': 
    test = test() 
    test.process() 
+1

그냥 솔루션을 게시하지 마십시오, 그것의 설명도 추가하십시오. – sjaustirni

관련 문제