Python indirmeden önce bir dosyanın boyutunu alın

oy
34

Bir web sunucusundan bir dizinin tamamını indiriyorum. Tamam çalışır, ama sunucuda veya olmasın güncellendi eğer karşılaştırmak indirmek önce dosya boyutunu nasıl bilemiyorum. Bir FTP sunucusundan dosya indirme sanki bu yapılabilir mi?

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('^.*<a href=(\w+(?:\.txt|.zip)?).*$', html, re.MULTILINE)

for fname in fnames:
    print fname, ...

    f = urllib.urlopen(url + / + fname)

    #### Here I want to check the filesize to download or not #### 
    file = f.read()
    f.close()

    f = open (fname, w)
    f.write (file)
    f.close()

@Jon: hızlı cevap için teşekkür ederim. Bu, ancak inşaat web sunucusunda dosya boyutu indirilen dosyanın dosya boyutu biraz daha azdır.

Örnekler:

Local Size  Server Size
 2.223.533  2.115.516
   664.603    662.121

Bu CR / LF dönüşüm ile ilgisi?

Oluştur 08/08/2008 saat 14:35
kaynak kullanıcı
Diğer dillerde...                            


8 cevaplar

oy
7

dosyanın boyutu içerik-uzunluk başlığı olarak gönderilir. İşte urllib ile bunu elde etmek için yapılması gerekenler:

>>> site = urllib.urlopen("http://python.org")
>>> meta = site.info()
>>> print meta.getheaders("Content-Length")
['16535']
>>>
Cevap 08/08/2008 saat 14:41
kaynak kullanıcı

oy
19

Iade-urllib-nesne yöntemi kullanarak info(), sen retrived belge üzerinde çeşitli bilgi alabilirsiniz. Mevcut Google logosunu kapma örneği:

>>> 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

O kadar yapmanız, dosyanın boyutunu almak için, dict var urllibobject.info()['Content-Length']

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

Ve (karşılaştırma için) yerel dosyasının boyutunu elde etmek için, os.stat () komutunu kullanabilirsiniz:

os.stat("/the/local/file.zip").st_size
Cevap 08/08/2008 saat 14:47
kaynak kullanıcı

oy
5

Bağlandığınız sunucu destekliyorsa Ayrıca bakmak ETAGların ve If-Modified-Since ve If-None-Match başlıkları.

Bu kullanma web sunucusu önbelleğe alma kurallarına yararlanacak ve dönecektir 304 Değil Modifiye içerik değişiklik olmadığı takdirde durum kodu.

Cevap 08/08/2008 saat 14:51
kaynak kullanıcı

oy
22

Ben ne görüyorsanız çoğaltılamaz adres:

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

Çıkışlar bu:

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

Yanlış burada ne işim var? os.stat (). doğru boyutu dönen değil st_size mı?


Düzenleme: Tamam, sorunun ne olduğunu anladım:

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

Bu çıkışlar:

$ 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

Eğer ikili Okuma / yazma için her iki dosya açma emin olun.

// open for binary write
open(filename, "wb")
// open for binary read
open(filename, "rb")
Cevap 08/08/2008 saat 15:21
kaynak kullanıcı

oy
2

Python3 In:

>>> import urllib.request
>>> site = urllib.request.urlopen("http://python.org")
>>> print("FileSize: ", site.length)
Cevap 26/08/2014 saat 10:31
kaynak kullanıcı

oy
1

Bir istekler HEAD yerine GET (ayrıca yazdırır HTTP üst) kullanarak çözüm tabanlı:

#!/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))

kullanım

$ python filesize-remote-url.py https://httpbin.org/image/jpeg
...
Content-Length                          : 35588
FILE SIZE (MB)                          : 0.03 MB
Cevap 04/12/2016 saat 10:21
kaynak kullanıcı

oy
1

(3,5 üzerinde test) bir python3 yaklaşımı için ben tavsiye ederim:

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())
Cevap 27/09/2017 saat 05:33
kaynak kullanıcı

oy
0

Yerel / sunucu dosya boyutu farkı ilişkin @PabloG

Onu ise neden oluştuğu üst düzey açıklayıcı açıklama:

diskteki boyut bazen verilerin gerçek boyutu farklıdır. Bu altta yatan dosya sistemine bağlıdır ve nasıl verilere göre çalışır. Eğer provice 'blok / küme boyutu' istenir flash disk biçimlendirme yaparken Windows görmüş olabilir ve [512b - 8kb] değişir gibi. bir dosyanın diskteki yazıldığında, bu disk bloklarının bir 'sıralama-bağlantılı listesi' de storled edilir. Belirli bir blok bir dosyanın mağaza bölümüne kullanıldığında, başka hiçbir dosya içeriğini yığın hiçbir tamamı blok alanı occupuing bu yüzden bile, aynı blok ve depolanacak, blok diğer dosyaları tarafından saf dışı bırakılmış.

Örnek: Dosya sistemi 512b bloklar üzerinde bölünmüş ve biz 600b dosyasını depolamak için gereken zaman, iki blok işgal edilecektir. İkinci blok sadece 88b kesimidir ve kalan (512-88) B 'dosya boyutu-disk' olarak 1024b olarak kullanılamaz Oluşan olacak ise ilk blok tam olarak kullanılacaktır. , Windows 'dosya boyutu' ve 'diskte boyutu' için farklı gösterimler vardır nedeni budur.

NOT: Farklı lehte ve küçük / büyük FS bloğu ile gelen dezavantajları vardır, bu nedenle dosya sistemi ile oynamadan önce daha iyi bir araştırma yapın.

Cevap 28/01/2020 saat 23:45
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more