Đâ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?]
4có 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 đầuHầ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 client
1. botocore.response.StreamingBody
không có phương thức client
1. Vì
_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à client
8] vào client
7, 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?]
0Cả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 ❤️