디스크에 쓰지 않고 AWS S3의 텍스트 파일을 팬더로 가져오는 방법
탭 구분표인 S3에 저장된 텍스트 파일이 있습니다.팬더에 로드하고 싶은데 헤로쿠 서버에서 실행 중이라 저장이 먼저 안 됩니다.여기 제가 지금까지 가지고 있는 것이 있습니다.
import io
import boto3
import os
import pandas as pd
os.environ["AWS_ACCESS_KEY_ID"] = "xxxxxxxx"
os.environ["AWS_SECRET_ACCESS_KEY"] = "xxxxxxxx"
s3_client = boto3.client('s3')
response = s3_client.get_object(Bucket="my_bucket",Key="filename.txt")
file = response["Body"]
pd.read_csv(file, header=14, delimiter="\t", low_memory=False)
오류는
OSError: Expected file path name or file-like object, got <class 'bytes'> type
어떻게 하면 응답 기관을 판다가 수용할 수 있는 형식으로 전환할 수 있습니까?
pd.read_csv(io.StringIO(file), header=14, delimiter="\t", low_memory=False)
returns
TypeError: initial_value must be str or None, not StreamingBody
pd.read_csv(io.BytesIO(file), header=14, delimiter="\t", low_memory=False)
returns
TypeError: 'StreamingBody' does not support the buffer interface
업데이트 - 다음과 같은 작업을 수행합니다.
file = response["Body"].read()
그리고.
pd.read_csv(io.BytesIO(file), header=14, delimiter="\t", low_memory=False)
pandas
사용하다boto
위해서read_csv
, 따라서 다음을 수행할 수 있어야 합니다.
import boto
data = pd.read_csv('s3://bucket....csv')
필요하시면boto3
당신이 하고 있기 때문에python3.4+
,넌 할 수 있다.
import boto3
import io
s3 = boto3.client('s3')
obj = s3.get_object(Bucket='bucket', Key='key')
df = pd.read_csv(io.BytesIO(obj['Body'].read()))
버전 0.20.1 이후 pandas
사용하다s3fs
, 아래의 답변을 참조하십시오.
이제 팬더는 S3 URL을 처리할 수 있습니다.간단히 다음을 수행할 수 있습니다.
import pandas as pd
import s3fs
df = pd.read_csv('s3://bucket-name/file.csv')
없으면 설치하셔야 합니다.pip install s3fs
인증
S3 버킷이 개인용이며 인증이 필요한 경우 다음 두 가지 옵션이 있습니다.
1- 구성 파일에 액세스 자격 증명 추가
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
아니면
2- 다음 환경변수를 적절한 값으로 설정합니다.
aws_access_key_id
aws_secret_access_key
aws_session_token
이것은 최근의 팬더들에게서 지지를 받고 있습니다. 보세요.
http://pandas.pydata.org/pandas-docs/stable/io.html#reading-remote-files
예를 들면,
df = pd.read_csv('s3://pandas-test/tips.csv')
python 3.6 이상을 위해 Amazon은 이제 awswrangler라고 불리는 Panda를 그들의 서비스와 함께 사용할 수 있는 정말 좋은 라이브러리를 가지고 있습니다.
import awswrangler as wr
import boto3
# Boto3 session
session = boto3.session.Session(aws_access_key_id='XXXX',
aws_secret_access_key='XXXX')
# Awswrangler pass forward all pd.read_csv() function args
df = wr.s3.read_csv(path='s3://bucket/path/',
boto3_session=session,
skiprows=2,
sep=';',
decimal=',',
na_values=['--'])
awswrangler를 설치하기pip install awswrangler
s3fs를 사용하면 다음과 같이 처리할 수 있습니다.
import s3fs
import pandas as pd
fs = s3fs.S3FileSystem(anon=False)
# CSV
with fs.open('mybucket/path/to/object/foo.pkl') as f:
df = pd.read_csv(f)
# Pickle
with fs.open('mybucket/path/to/object/foo.pkl') as f:
df = pd.read_pickle(f)
파일이 너무 클 수 있기 때문에 데이터 프레임에 파일을 모두 로드하는 것은 현명하지 않습니다.따라서 한 줄씩 읽어 데이터 프레임에 저장합니다.네, read_csv에 청크 크기를 제공할 수도 있지만 읽은 행 수를 유지해야 합니다.
그래서 저는 다음과 같은 엔지니어링을 생각해 냈습니다.
def create_file_object_for_streaming(self):
print("creating file object for streaming")
self.file_object = self.bucket.Object(key=self.package_s3_key)
print("File object is: " + str(self.file_object))
print("Object file created.")
return self.file_object
for row in codecs.getreader(self.encoding)(self.response[u'Body']).readlines():
row_string = StringIO(row)
df = pd.read_csv(row_string, sep=",")
작업이 끝나면 df도 삭제합니다.del df
텍스트 파일의 경우 파이프로 구분된 파일과 함께 아래 코드를 사용할 수 있습니다. 예:-
import pandas as pd
import io
import boto3
s3_client = boto3.client('s3', use_ssl=False)
bucket = #
prefix = #
obj = s3_client.get_object(Bucket=bucket, Key=prefix+ filename)
df = pd.read_fwf((io.BytesIO(obj['Body'].read())) , encoding= 'unicode_escape', delimiter='|', error_bad_lines=False,header=None, dtype=str)
옵션은 csv를 다음을 통해 json으로 변환하는 것입니다.df.to_dict()
그리고 끈으로 보관을 합니다.CSV가 요구 사항이 아니라 데이터 프레임을 S3 버킷에 신속하게 넣고 다시 검색하려는 경우에만 해당됩니다.
from boto.s3.connection import S3Connection
import pandas as pd
import yaml
conn = S3Connection()
mybucket = conn.get_bucket('mybucketName')
myKey = mybucket.get_key("myKeyName")
myKey.set_contents_from_string(str(df.to_dict()))
이것은 df를 dict 문자열로 변환한 후 S3에 json으로 저장합니다.나중에 같은 json 형식으로 읽을 수 있습니다.
df = pd.DataFrame(yaml.load(myKey.get_contents_as_string()))
다른 솔루션들도 좋지만, 이것은 조금 더 간단합니다.Yaml이 꼭 필요한 것은 아니지만 json 문자열을 구문 분석하는 데 필요합니다.만약 S3 파일이 반드시 CSV일 필요가 없다면 이것은 빠른 수정이 될 수 있습니다.
import s3fs
import pandas as pd
s3 = s3fs.S3FileSystem(profile='<profile_name>')
pd.read_csv(s3.open(<s3_path>))
import os
import pandas as pd
import boto3
session = boto3.Session(profile_name="test")
os.environ['AWS_ACCESS_KEY_ID'] = session.get_credentials().access_key
os.environ['AWS_SECRET_ACCESS_KEY'] = session.get_credentials().secret_key
이렇게 하면 ~/.aws/credentials에 저장한 모든 프로파일(AWS 계정)을 사용할 수 있습니다.
df = pd.read_csv("s3://xxxx.csv")
언급URL : https://stackoverflow.com/questions/37703634/how-to-import-a-text-file-on-aws-s3-into-pandas-without-writing-to-disk
'programing' 카테고리의 다른 글
CSS를 사용하여 텍스트를 미러링/플립할 수 있습니까? (0) | 2023.10.14 |
---|---|
POST 변수 가져오기 (0) | 2023.10.14 |
CSS 스타일 각진 방법JS 지시? (0) | 2023.10.14 |
Visual Studio 2017과 관련된 Node.js 서버 프로세스를 끌 수 있습니까? (0) | 2023.10.14 |
ubuntu@aws 마이크로 인스턴스에서 mysql의 메모리 사용량 감소 (0) | 2023.10.14 |