পাইথনে ডাউনলোড করার আগে একটি ফাইলের আকার পান

আমি একটি ওয়েব সার্ভার থেকে একটি সম্পূর্ণ ডিরেক্টরি ডাউনলোড করছি। এটি ঠিক আছে কাজ করে, তবে সার্ভারে আপডেট করা হলে বা ডাউনলোড করার আগে ডাউনলোড করার আগে ফাইল সাইজ কিভাবে পেতে হয় তা আমি বুঝি না। আমি FTP সার্ভার থেকে ফাইল ডাউনলোড হিসাবে এটি করা যেতে পারে?

import urllib
import re

url = "http://www.someurl.com"

# Download the page locally
f = urllib.urlopen(url)
html = f.read()
f.close()

f = open ("temp.htm", "w")
f.write (html)
f.close()

# List only the .TXT / .ZIP files
fnames = re.findall('^.*

@ জোন: আপনার দ্রুত উত্তর দেওয়ার জন্য ধন্যবাদ। এটি কাজ করে, কিন্তু ওয়েব সার্ভারে ফাইলসিটি ডাউনলোড করা ফাইলের ফাইলসাইটের চেয়ে সামান্য কম।

উদাহরণ:

Local Size  Server Size
 2.223.533  2.115.516
   664.603    662.121

সিআর / এলএফ রূপান্তর সঙ্গে এটি কিছু আছে?

0
ro fr hi
আপনি ঠিক আছেন, লেখার জন্য স্থানীয় ফাইল খোলার সময় "wb" ব্যবহার করছেন না। একটি যাদুমন্ত্র মত কাজ করে! ধন্যবাদ
যোগ লেখক PabloG, উৎস
সম্ভবত। আপনি এটি পার্থক্য চালাতে পারেন এবং একটি পার্থক্য দেখতে পারেন? এছাড়াও আপনি বাইনারি (.zip) ফাইল ফাইলের আকার পার্থক্য দেখতে পাবেন? সম্পাদনা করুন: এটি এমন যেখানে এট্যাগগুলি এমন জিনিস যেখানে সহজে আসে। সার্ভার আপনাকে কিছু বলবে যখন কিছু পরিবর্তন হবে, তাই আপনাকে এটি সম্পূর্ণ করার জন্য সম্পূর্ণ ফাইলটি ডাউনলোড করতে হবে না।
যোগ লেখক Jonathan Works, উৎস

7 উত্তর

Return-urllib-object পদ্ধতি ব্যবহার করে info() , আপনি retrived নথির বিভিন্ন তথ্য পেতে পারেন। বর্তমান গুগল লোগো দখল উদাহরণ:

>>> import urllib
>>> d = urllib.urlopen("http://www.google.co.uk/logos/olympics08_opening.gif")
>>> print d.info()

Content-Type: image/gif
Last-Modified: Thu, 07 Aug 2008 16:20:19 GMT  
Expires: Sun, 17 Jan 2038 19:14:07 GMT 
Cache-Control: public 
Date: Fri, 08 Aug 2008 13:40:41 GMT 
Server: gws 
Content-Length: 20172 
Connection: Close

It's a dict, so to get the size of the file, you do urllibobject.info()['Content-Length']

print f.info()['Content-Length']

এবং স্থানীয় ফাইলের আকার (তুলনা জন্য) পেতে, আপনি os.stat() কমান্ড ব্যবহার করতে পারেন:

os.stat("/the/local/file.zip").st_size
0
যোগ
আমি এই সমাধান ব্যবহার করা হয়েছে, যদিও আমি একটি প্রান্ত মামলা আঘাত যেখানে কখনও কখনও বিষয়বস্তু দৈর্ঘ্যের হেডার সংজ্ঞায়িত করা হয় না। কেউ ব্যাখ্যা করতে পারেন কেন এটি ধারাবাহিকভাবে ফিরে আসবে না?
যোগ লেখক wbeange, উৎস

একটি অনুরোধ - GET এর পরিবর্তে হেড ব্যবহার করে সমাধান-এর মাধ্যমে (HTTP হেডারগুলি প্রিন্ট করে):

#!/usr/bin/python
# display size of a remote file without downloading

from __future__ import print_function
import sys
import requests

# number of bytes in a megabyte
MBFACTOR = float(1 << 20)

response = requests.head(sys.argv[1], allow_redirects=True)

print("\n".join([('{:<40}: {}'.format(k, v)) for k, v in response.headers.items()]))
size = response.headers.get('content-length', 0)
print('{:<40}: {:.2f} MB'.format('FILE SIZE', int(size) / MBFACTOR))

ব্যবহার

<�প্রাক> <�কোড> $ পাইথন ফাইলসাইট -remote-url.py https://httpbin.org/image/jpeg ... সামগ্রী-দৈর্ঘ্য: 35588 FILE SIZE (মেগাবাইট): 0.03 মেগাবাইট </কোড>
0
যোগ

একটি Python3 (3.5 উপর পরীক্ষিত) পদ্ধতির জন্য আমি সুপারিশ চাই:

with urlopen(file_url) as in_file, open(local_file_address, 'wb') as out_file:
    print(in_file.getheader('Content-Length'))
    out_file.write(response.read())
0
যোগ

ফাইলের আকারটি বিষয়বস্তু-দৈর্ঘ্যের শিরোনাম হিসাবে পাঠানো হয়। এখানে urllib এর সাথে কিভাবে এটি পেতে হয়:

>>> site = urllib.urlopen("http://python.org")
>>> meta = site.info()
>>> print meta.getheaders("Content-Length")
['16535']
>>>
0
যোগ

এছাড়াও যদি সার্ভারটি আপনি এটি সমর্থন করতে সংযুক্ত থাকেন তবে এটগগুলি এবং যদি-সংশোধিত-যেহেতু এবং যদি-কেউ-ম্যাচ হেডারগুলি

এইগুলি ব্যবহার করে ওয়েবসার্ভারের ক্যাশিং নিয়মগুলির সুবিধা গ্রহণ করবে এবং একটি 304 সংশোধিত নয় অবস্থা কোড ফিরিয়ে আনবে যদি বিষয়বস্তু পরিবর্তিত না হয়

0
যোগ

আপনি যা দেখছেন তা পুনর্ব্যক্ত করেছেন:

import urllib, os
link = "http://python.org"
print "opening url:", link
site = urllib.urlopen(link)
meta = site.info()
print "Content-Length:", meta.getheaders("Content-Length")[0]

f = open("out.txt", "r")
print "File on disk:",len(f.read())
f.close()


f = open("out.txt", "w")
f.write(site.read())
site.close()
f.close()

f = open("out.txt", "r")
print "File on disk after download:",len(f.read())
f.close()

print "os.stat().st_size returns:", os.stat("out.txt").st_size

এই আউটপুটগুলি:

opening url: http://python.org
Content-Length: 16535
File on disk: 16535
File on disk after download: 16535
os.stat().st_size returns: 16861

আমি কি এখানে ভুল করছেন? Osstat ()। সঠিক আকার ফেরত না st_size?


সম্পাদনা: ঠিক আছে, আমি বুঝতে পেরেছি সমস্যা কি ছিল:

import urllib, os
link = "http://python.org"
print "opening url:", link
site = urllib.urlopen(link)
meta = site.info()
print "Content-Length:", meta.getheaders("Content-Length")[0]

f = open("out.txt", "rb")
print "File on disk:",len(f.read())
f.close()


f = open("out.txt", "wb")
f.write(site.read())
site.close()
f.close()

f = open("out.txt", "rb")
print "File on disk after download:",len(f.read())
f.close()

print "os.stat().st_size returns:", os.stat("out.txt").st_size

এই আউটপুট:

$ python test.py
opening url: http://python.org
Content-Length: 16535
File on disk: 16535
File on disk after download: 16535
os.stat().st_size returns: 16535

আপনি বাইনারি পড়া / লিখতে জন্য উভয় ফাইল খোলার হয় নিশ্চিত করুন।

// open for binary write
open(filename, "wb")
// open for binary read
open(filename, "rb")
0
যোগ
যখন আপনি site = urllib.urlopen (link) করেন তখন আপনি ফাইল ডাউনলোড করে ফেলেছেন, তাই এটি প্রকৃতভাবে বাফার থেকে ডাউনলোড করা ডাউনলোড করার আগে আকার নয় যেখানে আপনি সামগ্রী দৈর্ঘ্য পুনরুদ্ধার করছেন
যোগ লেখক Ciasto piekarz, উৎস
@ সিস্তোপিকারজ, আমি মনে করি এটি যখন আপনি পড়তে চেষ্টা করেন() যে ফাইল আসলে বাফারে ডাউনলোড হয়ে যায় এই উত্তরটি পরীক্ষা করুন
যোগ লেখক CaptainDaVinci, উৎস

পাইথন 3 এ:

>>> import urllib.request
>>> site = urllib.request.urlopen("http://python.org")
>>> print("FileSize: ", site.length)
0
যোগ
এই ফাইলটি ডাউনলোড করে!
যোগ লেখক Joseph Victor Zammit, উৎস