Tự động hóa tệp có thể tiết kiệm rất nhiều thời gian. Có một số cách để tự động hóa tệp trong Python. Cách dễ nhất để tải xuống các tệp là sử dụng vòng lặp Python đơn giản để lặp lại thông qua danh sách các URL để tải xuống. Cách tiếp cận nối tiếp này có thể hoạt động tốt với một vài tệp nhỏ, nhưng nếu bạn đang tải xuống nhiều tệp hoặc tệp lớn, bạn sẽ muốn sử dụng một cách tiếp cận song song để tối đa hóa tài nguyên tính toán của bạn.
Với thói quen tải xuống tệp song song, bạn có thể tải xuống đồng thời nhiều tệp và tiết kiệm một khoảng thời gian đáng kể. Hướng dẫn trình bày cách phát triển chức năng tải xuống tệp chung trong Python và áp dụng nó để tải xuống nhiều tệp với các cách tiếp cận nối tiếp và song song. Mã trong hướng dẫn này chỉ sử dụng các mô -đun có sẵn từ Thư viện tiêu chuẩn Python, do đó không cần cài đặt.
Nhập các mô -đun
Đối với ví dụ này, chúng tôi chỉ cần các mô -đun Python ____10 và
urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
1 để tải xuống các tệp song song. Các mô -đun urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
0 và urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
1 đều có sẵn từ Thư viện tiêu chuẩn Python, vì vậy bạn đã giành chiến thắng để thực hiện bất kỳ cài đặt nào.Chúng tôi cũng sẽ nhập mô -đun
urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
4 để theo dõi thời gian tải xuống các tệp riêng lẻ và so sánh hiệu suất giữa các thói quen tải xuống nối tiếp và song song. Mô -đun urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
4 cũng là một phần của thư viện tiêu chuẩn Python.import requests
import time
from multiprocessing import cpu_count
from multiprocessing.pool import ThreadPool
Xác định URL và tên tệp
Tôi sẽ trình diễn các bản tải xuống tệp song song trong Python bằng cách sử dụng các tệp GridMMet NetCDF có chứa dữ liệu lượng mưa hàng ngày cho Hoa Kỳ.
Ở đây, tôi chỉ định các URL cho bốn tệp trong một danh sách. Trong các ứng dụng khác, bạn có thể lập trình tạo một danh sách các tệp để tải xuống.
urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
Mỗi URL phải được liên kết với vị trí tải xuống của nó. Ở đây, tôi đã tải xuống các tệp vào thư mục Windows ‘Tải xuống. Tôi đã mã hóa các tên tệp trong một danh sách cho sự đơn giản và minh bạch. Với ứng dụng của bạn, bạn có thể muốn viết mã sẽ phân tích URL đầu vào và tải xuống vào một thư mục cụ thể.
fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
Đa xử lý đòi hỏi các chức năng song song chỉ có một đối số [có một số cách giải quyết, nhưng chúng tôi đã giành chiến thắng ở đây]. Để tải xuống một tập tin, chúng tôi sẽ cần chuyển hai đối số, URL và tên tệp. Vì vậy, chúng tôi sẽ zip danh sách
urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
6 và urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
7 cùng nhau để có được một danh sách các bộ dữ liệu. Mỗi tuple trong danh sách sẽ chứa hai yếu tố; Một URL và tên tệp tải xuống cho URL. Bằng cách này, chúng ta có thể chuyển một đối số duy nhất [tuple] chứa hai mẩu thông tin.inputs = zip[urls, fns]
Chức năng tải xuống URL
Bây giờ chúng tôi đã chỉ định các URL để tải xuống và tên tệp liên quan của chúng, chúng tôi cần một chức năng để tải xuống URL [
urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
8].Chúng tôi sẽ chuyển một đối số [
urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
9] cho urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
8. Đối số này sẽ là một điều khác biệt [danh sách hoặc tuple] trong đó phần tử đầu tiên là URL tải xuống [fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
1] và phần tử thứ hai là tên tệp [fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
2]. Các phần tử được gán cho các biến [fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
1 và fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
2] cho khả năng đọc.Bây giờ hãy tạo một câu lệnh thử trong đó URL được truy xuất và ghi vào tệp sau khi nó được tạo. Khi tệp được viết, URL và thời gian tải xuống được trả về. Nếu một ngoại lệ xảy ra, một tin nhắn được in.
Hàm
urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
8 là thịt của mã của chúng tôi. Nó thực hiện công việc thực tế của việc tải xuống và tạo tập tin. Bây giờ chúng ta có thể sử dụng chức năng này để tải xuống các tệp trong sê -ri [sử dụng một vòng lặp] và song song. Hãy cùng đi qua những ví dụ đó.def download_url[args]:
t0 = time.time[]
url, fn = args[0], args[1]
try:
r = requests.get[url]
with open[fn, 'wb'] as f:
f.write[r.content]
return[url, time.time[] - t0]
except Exception as e:
print['Exception in download_url[]:', e]
Tải xuống nhiều tệp với vòng lặp Python
Để tải xuống danh sách các URL vào các tệp được liên kết, hãy lặp qua ITEBLE [
fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
6] mà chúng tôi đã tạo, chuyển từng phần tử cho urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
8. Sau mỗi lần tải xuống hoàn tất, chúng tôi sẽ in URL đã tải xuống và thời gian tải xuống.Tổng thời gian để tải xuống tất cả các URL sẽ in sau khi tất cả các bản tải xuống đã được hoàn thành.
t0 = time.time[]
for i in inputs:
result = download_url[i]
print['url:', result[0], 'time:', result[1]]
print['Total time:', time.time[] - t0]
Output:
url: //www.northwestknowledge.net/metdata/data/pr_1979.nc time: 16.381176710128784
url: //www.northwestknowledge.net/metdata/data/pr_1980.nc time: 11.475878953933716
url: //www.northwestknowledge.net/metdata/data/pr_1981.nc time: 13.059367179870605
url: //www.northwestknowledge.net/metdata/data/pr_1982.nc time: 12.232381582260132
Total time: 53.15849542617798
Mất từ 11 đến 16 giây để tải xuống các tệp riêng lẻ. Tổng thời gian tải xuống là ít hơn một phút. Thời gian tải xuống của bạn sẽ thay đổi dựa trên kết nối mạng cụ thể của bạn.
Hãy để so sánh cách tiếp cận nối tiếp [vòng lặp] này với cách tiếp cận song song dưới đây.
Để bắt đầu, hãy tạo một hàm [
fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
8] để xử lý tải xuống song song. Hàm [fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
8] sẽ lấy một đối số, một URL có thể sử dụng và tên tệp liên quan [biến fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
6 mà chúng tôi đã tạo trước đó].Tiếp theo, có được số lượng CPU có sẵn để xử lý. Điều này sẽ xác định số lượng luồng để chạy song song.
Bây giờ sử dụng
urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
1 inputs = zip[urls, fns]
2 để ánh xạ fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
6 cho hàm urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
8. Ở đây chúng tôi sử dụng phương pháp inputs = zip[urls, fns]
5 của inputs = zip[urls, fns]
2 và chuyển nó hàm urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
8 và các đối số đầu vào cho urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
8 [biến fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
6]. Phương thức inputs = zip[urls, fns]
5 sẽ chạy đồng thời urls = ['//www.northwestknowledge.net/metdata/data/pr_1979.nc',
'//www.northwestknowledge.net/metdata/data/pr_1980.nc',
'//www.northwestknowledge.net/metdata/data/pr_1981.nc',
'//www.northwestknowledge.net/metdata/data/pr_1982.nc']
8 cho số lượng luồng được chỉ định [nghĩa là tải xuống song song].Do đó, nếu chúng tôi có bốn tệp và bốn luồng, tất cả các tệp có thể được tải xuống cùng một lúc thay vì chờ một lần tải xuống hoàn thành trước khi bắt đầu tiếp theo. Điều này có thể tiết kiệm một lượng đáng kể thời gian xử lý.
Trong phần cuối cùng của hàm
fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
8, các URL đã tải xuống và thời gian cần thiết để tải xuống mỗi URL được in.def download_parallel[args]:
cpus = cpu_count[]
results = ThreadPool[cpus - 1].imap_unordered[download_url, args]
for result in results:
print['url:', result[0], 'time [s]:', result[1]]
Khi
fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
6 và fns = [r'C:\Users\konrad\Downloads\pr_1979.nc',
r'C:\Users\konrad\Downloads\pr_1980.nc',
r'C:\Users\konrad\Downloads\pr_1981.nc',
r'C:\Users\konrad\Downloads\pr_1982.nc']
8 được xác định, các tệp có thể được tải xuống song song với một dòng mã duy nhất.download_parallel[inputs]
Output:
url: //www.northwestknowledge.net/metdata/data/pr_1980.nc time [s]: 14.641696214675903
url: //www.northwestknowledge.net/metdata/data/pr_1981.nc time [s]: 14.789752960205078
url: //www.northwestknowledge.net/metdata/data/pr_1979.nc time [s]: 15.052601337432861
url: //www.northwestknowledge.net/metdata/data/pr_1982.nc time [s]: 23.287317752838135
Total time: 23.32273244857788
Lưu ý rằng phải mất nhiều thời gian hơn để tải xuống từng tệp riêng lẻ với cách tiếp cận. Đây có thể là kết quả của việc thay đổi tốc độ mạng hoặc chi phí cần thiết để ánh xạ các bản tải xuống cho các luồng tương ứng của chúng. Mặc dù các tệp riêng lẻ mất nhiều thời gian hơn để tải xuống, phương pháp song song dẫn đến giảm 50% trong tổng thời gian tải xuống.
Bạn có thể thấy cách xử lý song song có thể giảm đáng kể thời gian xử lý cho nhiều tệp. Khi số lượng tệp tăng lên, bạn sẽ tiết kiệm nhiều thời gian hơn bằng cách sử dụng phương pháp tải xuống song song.
Sự kết luận
Tự động hóa tệp trong các thói quen phát triển và phân tích của bạn có thể giúp bạn tiết kiệm rất nhiều thời gian. Như được chứng minh bằng hướng dẫn này, việc triển khai thói quen tải xuống song song có thể giảm đáng kể thời gian thu thập tệp nếu bạn yêu cầu nhiều tệp hoặc tệp lớn.
Tìm hiểu GIS từ các chuyên gia trong ngành
Cho dù bạn đang tìm cách đưa các kỹ năng GIS của bạn lên một tầm cao mới, hoặc chỉ bắt đầu với GIS, chúng tôi có một khóa học cho bạn! Chúng tôi liên tục tạo và quản lý nhiều khóa học hơn để giúp bạn cải thiện các kỹ năng không gian địa lý của bạn.
Tất cả các khóa học của chúng tôi được giảng dạy bởi các chuyên gia trong ngành và bao gồm hướng dẫn video từng bước để bạn không bị lạc trong video và bài đăng trên blog, dữ liệu có thể tải xuống để bạn có thể sao chép mọi thứ mà người hướng dẫn làm và mã bạn có thể sao chép để bạn có thể tránh gõ lặp đi lặp lại