Iter_lines Python boto3

Đâ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 [thiết bị xuất chuẩn]

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

import codecs
import csv

import boto3


client = boto3.client["s3"]

def read_csv_from_s3[bucket_name, key, column]:
    data = client.get_object[Bucket=bucket_name, Key=key]

    for row in csv.DictReader[codecs.getreader["utf-8"][data["Body"]]]:
        print[row[column]]

Chúng ta sẽ tìm hiểu chi tiết giải pháp trên 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à vịt cao su trong trường hợp này

Đang tải xuống tệp từ S3

Bắt đầu nào. Trước tiên, chúng ta cần tìm hiểu cách tải xuống tệp từ S3 bằng Python. SDK AWS chính thức dành cho Python được gọi là Boto3. , chúng ta có thể tạo phiên bản client cho S3 bằng cách gọi boto3.client["s3"]. Sau đó, chúng tôi gọi phương thức trên client với tên bộ chứa 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 ta quan tâm là giá trị trả về của lời gọi phương thức. Giá trị trả về là một từ điển Python. Trong khóa Body 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ể data["Body"] là một. Giữ suy nghĩ đó đi

Đọc tệp CSV

Hãy chuyển trọng tâm sang xử lý các tệp CSV. Chúng tôi muốn truy cập từng giá trị của một cột cụ thể. từ thư viện tiêu chuẩn dường như là một ứng cử viên xuất sắc cho công việc này. Nó trả về một [lớp thực hiện các phương thức lặp

_csv.Error: iterator should return strings, not bytes [did you open the file in text mode?]
1 và
_csv.Error: iterator should return strings, not bytes [did you open the file in text mode?]
2] mà chúng ta có thể sử dụng để truy cập từng hàng trong vòng lặp for.
_csv.Error: iterator should return strings, not bytes [did you open the file in text mode?]
3. Nhưng những gì chúng ta nên chuyển vào X như một đối số?

Tất cả các đối số tùy chọn hoặc từ khóa khác được chuyển đến phiên bản trình đọc bên dưới

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

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

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 khi phương thức next[] của nó được gọi

botocore.response.StreamingBody ủng hộ 🎉

Thật không may, phương thức

_csv.Error: iterator should return strings, not bytes [did you open the file in text mode?]
2 không trả về 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 cách nào để thu hẹp khoảng cách giữa loại botocore.response.StreamingBody và loại mà mô-đun

_csv.Error: iterator should return strings, not bytes [did you open the file in text mode?]
8 yêu cầu? . Vì vậy, 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 làm ngược lại nên chúng tôi đang tìm kiếm một "bộ giải mã", cụ thể là một bộ giải mã có thể xử lý dữ liệu luồng.

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

_csv.Error: iterator should return strings, not bytes [did you open the file in text mode?]
9 lấy a làm đối số đầu vào. Trong Python, điều này có nghĩa là đối tượng phải có phương thức client1. botocore.response.StreamingBody không có phương thức client1.

_csv.Error: iterator should return strings, not bytes [did you open the file in text mode?]
9 cũng hỗ trợ giao thức iterator, nên chúng ta có thể truyền đối tượng của thể hiện này vào
_csv.Error: iterator should return strings, not bytes [did you open the file in text mode?]
0.

Mảnh ghép cuối cùng là. Làm thế nào để chúng tôi tạo ra

_csv.Error: iterator should return strings, not bytes [did you open the file in text mode?]
9? . Chúng tôi chuyển codec mà chúng tôi chọn [trong trường hợp này là client8] vào client7, tạo ra_______1_______9. Đ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 boto3.client["s3"]1 vào
_csv.Error: iterator should return strings, not bytes [did you open the file in text mode?]
0

Cảm ơn bạn đã theo dõi phần 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 các bạn đã lắng nghe ❤️

Máy khách boto3 ['S3'] là gì?

Một trong những thành phần cốt lõi của nó là S3, dịch vụ lưu trữ đối tượng do AWS cung cấp. Với tính khả dụng và độ bền ấn tượng, nó đã trở thành cách tiêu chuẩn để lưu trữ video, hình ảnh và dữ liệu. Bạn có thể kết hợp S3 với các dịch vụ khác để xây dựng các ứng dụng có khả năng mở rộng vô hạn. Boto3 là ​​tên của SDK Python dành cho AWS .

boto3 có sử dụng SSL không?

Ứng dụng boto3 bao gồm tham số use_ssl. use_ssl [boolean] -- Có sử dụng SSL hay không. Theo mặc định, SSL được sử dụng . Lưu ý rằng không phải tất cả các dịch vụ đều hỗ trợ kết nối không phải ssl.

Chủ Đề