যদি আমার কোনও ইউআরএল থাকে যা যখন কোনও ওয়েব ব্রাউজারে জমা দেওয়া হয়, তখন একটি জিপ ফাইল সংরক্ষণের জন্য একটি ডায়ালগ বক্স পপ আপ করে দেয়, আমি পাইথনে এই জিপ ফাইলটি ধরার এবং ডাউনলোড করার বিষয়ে কীভাবে যাব?
যদি আমার কোনও ইউআরএল থাকে যা যখন কোনও ওয়েব ব্রাউজারে জমা দেওয়া হয়, তখন একটি জিপ ফাইল সংরক্ষণের জন্য একটি ডায়ালগ বক্স পপ আপ করে দেয়, আমি পাইথনে এই জিপ ফাইলটি ধরার এবং ডাউনলোড করার বিষয়ে কীভাবে যাব?
উত্তর:
বেশিরভাগ লোকেরা এটি requests
উপলভ্য থাকলে ব্যবহার করার পরামর্শ দেয় এবং requests
ডকুমেন্টেশনটি ইউআরএল থেকে কাঁচা ডেটা ডাউনলোড এবং সংরক্ষণের জন্য এটির পরামর্শ দেয়:
import requests
def download_url(url, save_path, chunk_size=128):
r = requests.get(url, stream=True)
with open(save_path, 'wb') as fd:
for chunk in r.iter_content(chunk_size=chunk_size):
fd.write(chunk)
যেহেতু উত্তরটি জিপ ফাইলটি ডাউনলোড এবং সংরক্ষণের বিষয়ে জিজ্ঞাসা করে , আমি জিপ ফাইলটি পড়ার বিষয়ে বিশদে যাইনি। সম্ভাবনার জন্য নীচের অনেকগুলি উত্তরগুলির মধ্যে একটি দেখুন।
যদি কোনও কারণে আপনার অ্যাক্সেস না থাকে তবে requests
আপনি তার urllib.request
পরিবর্তে ব্যবহার করতে পারেন । এটি উপরের মতো বেশ শক্তিশালী নাও হতে পারে।
import urllib.request
def download_url(url, save_path):
with urllib.request.urlopen(url) as dl_file:
with open(save_path, 'wb') as out_file:
out_file.write(dl_file.read())
অবশেষে, আপনি যদি পাইথন 2 টি এখনও ব্যবহার করেন, আপনি ব্যবহার করতে পারেন urllib2.urlopen
।
from contextlib import closing
def download_url(url, save_path):
with closing(urllib2.urlopen(url)) as dl_file:
with open(save_path, 'wb') as out_file:
out_file.write(dl_file.read())
আমি যতদূর বলতে পারি, এটি করার উপযুক্ত উপায় হ'ল:
import requests, zipfile, StringIO
r = requests.get(zip_file_url, stream=True)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
z.extractall()
অবশ্যই আপনি এটি পরীক্ষা করে দেখতে চান যে জিইটি সফল হয়েছিল r.ok
।
অজগর 3+ এর জন্য, স্ট্রিংআইও মডিউলটি আইও মডিউল সহ সাবটি করুন এবং স্ট্রিংআইও-র পরিবর্তে বাইটসআইও ব্যবহার করুন : এখানে প্রকাশিত নোটগুলি এই পরিবর্তনের কথা উল্লেখ করেছে।
import requests, zipfile, io
r = requests.get(zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall("/path/to/destination_directory")
z.extractall()
সঙ্গেz.extractall("/path/to/destination_directory")
urllib.request.urlretrieve(url, filename)
।
pd.read_table(z.open('filename'))
দিয়ে ব্যবহার করতে পারেন । আপনার যদি একটি জিপ url লিঙ্ক থাকে যাতে একাধিক ফাইল থাকে এবং আপনি কেবল একটি লোড করতে আগ্রহী হন তা কার্যকর Use
সাহায্যে এই ব্লগ পোস্টে , আমি এটা শুধু সঙ্গে কাজ পেয়েছেন requests
। অদ্ভুত stream
জিনিসের মূল বিষয়টি তাই আমাদের content
বড় অনুরোধগুলির জন্য কল করার দরকার নেই , যা স্মৃতিশক্তি আটকে রেখে এটি একবারে প্রক্রিয়া করা প্রয়োজন। stream
একটি সময়ে ডেটা এক খণ্ড মাধ্যমে iterating এই এড়াতে।
url = 'https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_02_tract_500k.zip'
target_path = 'alaska.zip'
response = requests.get(url, stream=True)
handle = open(target_path, "wb")
for chunk in response.iter_content(chunk_size=512):
if chunk: # filter out keep-alive new chunks
handle.write(chunk)
handle.close()
পাইথন 3 এ আমি কী কাজ করতে পারি তা এখানে:
import zipfile, urllib.request, shutil
url = 'http://www....myzipfile.zip'
file_name = 'myzip.zip'
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
shutil.copyfileobj(response, out_file)
with zipfile.ZipFile(file_name) as zf:
zf.extractall()
urllib.error.HTTPError: HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop.
?
হয় urllib2.urlopen ব্যবহার করুন, বা আপনি দুর্দান্ত Requests
মডিউলটি ব্যবহার করে চেষ্টা করতে পারেন এবং urllib2 মাথাব্যথা এড়াতে পারেন:
import requests
results = requests.get('url')
#pass results.content onto secondary processing...
zipfile
মডিউল: zip = zipfile.ZipFile(results.content)
। তারপর শুধু ব্যবহার করে ফাইলগুলি মাধ্যমে পার্স ZipFile.namelist()
, ZipFile.open()
অথবাZipFile.extractall()
আমি .bzip2 ফাইলটি কীভাবে সংরক্ষণ করব তা অনুসন্ধান করতে এখানে এসেছি। যারা এই সন্ধানে আসতে পারে তাদের জন্য কোডটি আটকান।
url = "http://api.mywebsite.com"
filename = "swateek.tar.gz"
response = requests.get(url, headers=headers, auth=('myusername', 'mypassword'), timeout=50)
if response.status_code == 200:
with open(filename, 'wb') as f:
f.write(response.content)
আমি কেবল ফাইলটি সেভ করতে চেয়েছিলাম।
উপরের সমাধানের জন্য @ অয়াভ্রামকে ধন্যবাদ, আমার ইউআরএল পথটি একটি জিপ করা ফোল্ডারের সাথে যুক্ত এবং BADZipfile এর একটি ত্রুটির মুখোমুখি হয়েছে (ফাইলটি একটি জিপ ফাইল নয়), এবং আমি বিস্ময়কর ছিলাম যদি আমি ইউআরএলটি পুনরুদ্ধার এবং সমস্তটি আনজিপড করে বেশ কয়েকবার চেষ্টা করি তবে হঠাৎ তাই আমি সমাধানটি কিছুটা সংশোধন করি। is_zipfile পদ্ধতিটি এখানে অনুসারে ব্যবহার করা হচ্ছে
r = requests.get(url, stream =True)
check = zipfile.is_zipfile(io.BytesIO(r.content))
while not check:
r = requests.get(url, stream =True)
check = zipfile.is_zipfile(io.BytesIO(r.content))
else:
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()