S3 버킷에 4.4MB 크기의 파일이 있고 boto3를 통해 다운로드하려고 할 때 객체 설명에 표시된 콘텐츠 길이가 맞지만 객체 본문이 비어 있습니다. 왜 그런 일이 일어나는지 아이디어가 있습니까?
s3 = session.client('s3')
obj = s3.get_object(Bucket=bucket, Key=key)
obj['ResponseMetadata']['HTTPHeaders']['content-length'] ## this returns 4598667
obj['ContentLength'] ## this returns 4598667 as well
obj['Body'].read().decode('utf-8') ## this returns ''
따라서 주석에서 언급했듯이 핵심은 csv.reader()
및 obj['Body'].read().decode('utf-8').splitlines()
(전체 코드는 여기 에서 찾을 수 있습니다 .)
스트리밍이 이미 이것을 처리하지 않는 이유는 무엇입니까?
csv.reader 정보 ( 문서에서 ) :
주어진 csvfile의 행을 반복 할 판독기 객체를 반환합니다. csvfile은 반복기 프로토콜을 지원하고 next () 메서드가 호출 될 때마다 문자열을 반환하는 모든 객체 일 수 있습니다. 파일 객체와 목록 객체가 모두 적합합니다. csvfile이 파일 객체 인 경우 newline = ''로 열어야합니다.
csv 파일에서 읽은 각 행 은 문자열 목록으로 반환됩니다 . QUOTE_NONNUMERIC 형식 옵션이 지정되지 않으면 자동 데이터 유형 변환이 수행되지 않습니다.
그렇게 말했듯이 실제 행을 보려면 csv.reader의 반환 데이터를 반복해야합니다.
코드 스 니펫 예 :
import csv
with open('eggs.csv', newline='') as csvfile:
spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
for row in spamreader:
print(', '.join(row))
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다