import os
import shutil
from urllib.request import ProxyHandler, build_opener

proxy = 'http://proxy.example.net:8080'
opener = build_opener(ProxyHandler({
    'http': proxy,
    'https': proxy,
}))

temporary = 'archive.zip.part'
destination = 'archive.zip'

with opener.open('https://downloads.example.net/archive.zip',
                 timeout=20) as response:
    with open(temporary, 'wb') as output:
        shutil.copyfileobj(response, output)

os.replace(temporary, destination)

URL va fayl nomlarini ilova uchun almashtiring. Proksi autentifikatsiyasisiz ruxsat etilgan ommaviy fayl yuklab olish uchun HTTP proksilar ro'yxati proksi URL uchun nomzod so'nggi nuqtalarni taqdim etishi mumkin. Bu maxsus urllib ochuvchisi HTTPS manzili uchun oddiy sertifikat tekshiruvi bilan HTTP proksidan foydalanadi. U global ochuvchini o'rnatmaydi; autentifikatsiya zarur bo'lsa, uning qo'llab-quvvatlanadigan sozlamasini talab qiladi.

copyfileobj bo'laklarga bo'lib nusxalaydi. Fayl kontekstidan chiqish uni yopadi va os.replace yakuniy nomni o'rnatishdan oldin buferlangan yozuvlarni bo'shatadi.

Agar so'rov yoki nusxalash xato ko'tarsa, nom o'zgartirish o'tkazib yuboriladi. Tozalash siyosati uchun qismiy fayl qolishi mumkin va bu oqim o'sha muvaffaqiyatsizlikda mavjud yakuniy faylga tegmaydi. Muvaffaqiyat bo'lsa, almashtirish o'sha yakuniy fayl ustidan yozishi mumkin, shuning uchun siyosatni ongli ravishda tanlang.

Bir vaqtdagi ishlar uchun noyob vaqtinchalik nomlardan foydalaning. Alohida ochuvchi obyektlar bir xil .part yo'lini baham ko'radigan ishlarni himoya qilmaydi.

20 soniyalik sozlama umumiy yuklab olish vaqtini emas, qo'llab-quvvatlanadigan socket amallarini cheklaydi. Butun ish uchun muddat ilovada alohida ishlov berishni talab qiladi. Uzatishning tugashi ham yuklangan faylni tekshirishdan alohida.

O'xshash maqolalar