Hướng dẫn how do i read a csv file in s3 python? - làm cách nào để đọc tệp csv trong s3 python?

Tôi đang cố gắng đọc một tệp CSV nằm trong thùng AWS S3 vào bộ nhớ dưới dạng dữ liệu gấu trúc bằng cách sử dụng mã sau:

import pandas as pd
import boto

data = pd.read_csv('s3:/example_bucket.s3-website-ap-southeast-2.amazonaws.com/data_1.csv')

Để cung cấp quyền truy cập đầy đủ, tôi đã đặt chính sách xô trên thùng S3 như sau:

{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]

}

Thật không may, tôi vẫn gặp lỗi sau trong Python:

boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed

Tự hỏi nếu ai đó có thể giúp giải thích cách đặt chính xác các quyền trong AWS S3 hoặc định cấu hình gấu trúc một cách chính xác để nhập tệp. Cảm ơn!

Đôi khi chúng ta có thể cần đọc trực tiếp một tệp CSV từ nhóm Amzon S3, chúng ta có thể đạt được điều này bằng cách sử dụng một số phương thức, theo cách phổ biến nhất là sử dụng mô -đun CSV.

Nhập CSV ở đầu tệp Python

import csv

sau đó chức năng và mã trông như thế này

s3 = boto3.client(
's3',
aws_access_key_id='XYZACCESSKEY',
aws_secret_access_key='XYZSECRETKEY',
region_name='us-east-1'
) #1

obj = s3.get_object(Bucket='bucket-name', Key='myreadcsvfile.csv') #2
data = obj['Body'].read().decode('utf-8').splitlines() #3
records = csv.reader(data) #4
headers = next(records) #5
print('headers: %s' % (headers))
for eachRecord in records: #6
print(eachRecord)

#1 - Tạo một đối tượng cho máy khách S3 có khóa truy cập S3, khóa và vùng bí mật (chỉ giả sử, người đọc đã biết khóa truy cập và khóa bí mật là gì.)access key , secret key and region (just assuming , reader already know what is access key and secret key.)

#2 - Nhận một đối tượng cho tên xô của chúng tôi cùng với tên tệp của tệp CSV.

Trong một số trường hợp, chúng tôi có thể không có tệp CSV trực tiếp trong thùng S3, chúng tôi có thể có các thư mục và thư mục bên trong để lấy tệp CSV, tại kịch bản đó, dòng số 2 sẽ thay đổi như bên dưới

obj = s3.get_object(Bucket='bucket-name', Key='folder/subfoler/myreadcsvfile.csv')

#3 - Với dòng thứ hai, chúng tôi đã đưa ra đối tượng của tệp CSV, bây giờ chúng tôi cần đọc nó và dữ liệu sẽ ở định dạng nhị phân để chúng tôi sử dụng hàm Decode () để chuyển đổi nó thành định dạng có thể đọc được.decode() function to convert it into readable format.

Sau đó, chúng tôi đang sử dụng hàm splutlines () để phân chia từng hàng dưới dạng một bản ghisplitlines() function to split each row as one record

#4 - Bây giờ chúng tôi đang sử dụng CSV.Reader (dữ liệu) để đọc dữ liệu trên từ dòng #3csv.reader(data) to read the above data from line #3

Với điều này, chúng tôi gần như có dữ liệu, chúng tôi chỉ cần tách các tiêu đề và dữ liệu thực tế

#5 - Với điều này, chúng tôi sẽ nhận được tất cả các tiêu đề của toàn bộ tệp CSV đó.

#6 - Bằng cách sử dụng cho vòng lặp, chúng tôi đang lặp lại từng bản ghi và in từng hàng của các tệp CSV.

Sau khi nhận được dữ liệu, chúng tôi không muốn dữ liệu và tiêu đề ở những nơi riêng biệt, chúng tôi muốn dữ liệu kết hợp cho biết giá trị nào thuộc về tiêu đề nào. Hãy làm điều đó ngay bây giờ, hãy dùng một biến một mảng trước đây cho vòng lặp

csvData = []
headerCount = len(headers)

và thay đổi vòng lặp như thế này

for eachRecord in records:
tmp = {}
for count in range(0,headerCount):
tmp[headers[count]] = line[count]
csvData.append(tmp)
print(csvData)

Bây giờ CSVDATA chứa dữ liệu ở bên dưới cho

. '}]

Lưu ý: Tôi đã định dạng dữ liệu theo định dạng này vì đó là yêu cầu của tôi, dựa trên một dữ liệu định dạng yêu cầu của một người có thể được thay đổi.

Hy vọng điều này có ích !, Mã hóa và đọc hạnh phúc

Hướng dẫn how do i read a csv file in s3 python? - làm cách nào để đọc tệp csv trong s3 python?

Shi Han

Đăng vào ngày 22 tháng 8 năm 2020 • Cập nhật vào ngày 8 tháng 9 năm 2020

Đây là một kịch bản. Có một tệp CSV khổng lồ trên Amazon S3. Chúng ta cần viết một hàm Python tải xuống, đọc và in giá trị trong một cột cụ thể trên đầu ra tiêu chuẩn (stdout).

Đơn giản Googling sẽ dẫn chúng ta đến câu trả lời cho nhiệm vụ này trong Stack Overflow. Mã này trông giống như một cái gì đó sau:

________số 8

Chúng tôi sẽ khám phá giải pháp ở trên chi tiết trong bài viết này. Hãy tưởng tượng điều này giống như một chương trình vịt cao su và bạn là con vịt cao su trong trường hợp này.

Tải xuống tệp từ S3

Bắt đầu nào. Đầu tiên, chúng ta cần tìm ra cách tải xuống một tệp từ S3 trong Python. SDK AWS chính thức cho Python được gọi là BOTO3. Theo tài liệu, chúng tôi có thể tạo phiên bản

{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
0 cho S3 bằng cách gọi
{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
1. Sau đó, chúng tôi gọi phương thức
{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
2 trên
{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
0 với tên xô và khóa làm đối số đầu vào để tải xuống một tệp cụ thể.

Bây giờ điều mà chúng tôi quan tâm là giá trị trả về của cuộc gọi phương thức

{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
2. Giá trị trả lại là một từ điển Python. Trong khóa
{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
5 của từ điển, chúng ta có thể tìm thấy nội dung của tệp được tải xuống từ S3. Cơ thể
{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
6 là
{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
7. Giữ suy nghĩ đó đi.

Đọc tệp CSV

Hãy chuyển trọng tâm của chúng tôi sang xử lý các tệp CSV. Chúng tôi muốn truy cập giá trị của một cột cụ thể từng cái một.

{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
8 từ thư viện tiêu chuẩn dường như là một ứng cử viên tuyệt vời cho công việc này. Nó trả về một trình lặp (lớp thực hiện các phương thức lặp
{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
9 và
boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed
0) mà chúng ta có thể sử dụng để truy cập từng hàng trong vòng lặp:
boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed
1. Nhưng chúng ta nên chuyển vào X như một đối số gì? Theo tài liệu, chúng ta nên tham khảo phiên bản của người đọc.

Tất cả các đối số từ khóa hoặc tùy chọn khác được chuyển đến thể hiện trình đọc cơ bản.

Ở đó chúng ta có thể thấy rằng đối số đầu tiên

boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed
2

có thể là bất kỳ đối tượng nào hỗ trợ giao thức iterator và trả về một chuỗi mỗi lần phương thức tiếp theo của nó ()next() method is called

{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
7 Hỗ trợ giao thức Iterator.

Thật không may, đó là phương thức

boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed
0 không trả về một chuỗi mà thay vào đó là byte.

_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

Đọc tệp CSV từ S3

Vậy làm thế nào để chúng ta thu hẹp khoảng cách giữa loại

{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
7 và loại theo yêu cầu của mô -đun
boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed
6? Chúng tôi muốn "chuyển đổi" các byte thành chuỗi trong trường hợp này. Do đó, mô -đun Codecs của thư viện tiêu chuẩn của Python dường như là một nơi để bắt đầu.

Hầu hết các codec tiêu chuẩn là mã hóa văn bản, mã hóa văn bản thành byte

Vì chúng tôi đang thực hiện ngược lại, chúng tôi đang tìm kiếm một "trình giải mã", cụ thể là một trình giải mã có thể xử lý dữ liệu luồng:

boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed
7

Giải mã dữ liệu từ luồng và trả về đối tượng kết quả.

boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed
7 lấy một đối tượng giống như tệp làm đối số đầu vào. Trong Python, điều này có nghĩa là đối tượng nên có phương thức
boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed
9.
{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
7 có phương pháp
boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed
9: https://botocore.amazonaws.com/v1/documentation/api/latest/reference

boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed
7 cũng hỗ trợ giao thức iterator, chúng tôi có thể chuyển đối tượng của phiên bản này vào

Phần cuối cùng của câu đố là: Làm thế nào để chúng ta tạo ra

boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed
7? Đó là nơi chức năng
import csv
5 diễn ra. Chúng tôi chuyển codec về sự lựa chọn của chúng tôi (trong trường hợp này là
import csv
6) vào
import csv
5, tạo ra ____27. Điều này cho phép chúng tôi đọc từng hàng của tệp CSV vào từ điển bằng cách chuyển
import csv
9 vào
{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
    {
        "Sid": "statement1",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::example_bucket"
    }
]
8:

Hướng dẫn how do i read a csv file in s3 python? - làm cách nào để đọc tệp csv trong s3 python?


Cảm ơn bạn đã theo dõi lời giải thích dài và chi tiết (có thể quá mệt mỏi) về một chương trình ngắn như vậy.Tôi hy vọng bạn thấy nó hữu dụng.Cảm ơn bạn nghe ❤.

Làm cách nào để đọc CSV từ AWS S3 trực tiếp bằng Python Boto3?

SDK AWS chính thức cho Python được gọi là BOTO3.Theo tài liệu, chúng tôi có thể tạo phiên bản máy khách cho S3 bằng cách gọi BOTO3.Client ("S3"). Sau đó, chúng tôi gọi phương thức get_Object () trên máy khách với tên xô và khóa làm đối số đầu vào để tải xuống một tệp cụ thể.create the client instance for S3 by calling boto3. client("s3") . Then we call the get_object() method on the client with bucket name and key as input arguments to download a specific file.

Làm cách nào để đọc tệp CSV trong Python?

Đọc một tệp CSV bằng Python..
Sử dụng thư viện CSV.Nhập CSV với Open ("./ Bwq.csv", 'r') dưới dạng tệp: csvreader = csv.reader (tệp) cho hàng trong csvreader: in (hàng) ở đây chúng tôi đang nhập thư viện CSV để sử dụng.....
Sử dụng thư viện Pandas.Nhập gấu trúc dưới dạng dữ liệu PD = pd.Read_CSV ("BWQ.CSV") dữ liệu ..