mengekstrak file terkompresi dari ekstensi .gz sambil mengunduhnya dari server ftp [duplikat]

Aug 20 2020

Saya telah membuat fungsi yang mengunduh file .gz dari server ftp yang diberikan dan saya ingin mengekstraknya dengan cepat saat mengunduh dan menghapus file terkompresi setelahnya. Bagaimana saya bisa melakukan itu?

sinex_domain = "ftp://cddis.gsfc.nasa.gov/gnss/products/bias/2013"

def download(sinex_domain):
    user = getpass.getuser()
    sinex_parse = urlparse(sinex_domain)

    sinex_connetion = FTP(sinex_parse.netloc)
    sinex_connetion.login()
    sinex_connetion.cwd(sinex_parse.path)
    sinex_files = sinex_connetion.nlst()
    sinex_userpath = "C:\\Users\\" + user + "\\DCBviz\\sinex"
    pathlib.Path(sinex_userpath).mkdir(parents=True, exist_ok=True)

    for fileName in sinex_files:
        local_filename = os.path.join(sinex_userpath, fileName)
        file = open(local_filename, 'wb')
        sinex_connetion.retrbinary('RETR '+ fileName, file.write, 1024)
        
        #want to extract files in this loop

        file.close()

    sinex_connetion.quit()

download(sinex_domain)

Jawaban

1 alani Aug 20 2020 at 02:09

Meskipun mungkin ada cara yang lebih cerdas yang menghindari penyimpanan seluruh data dalam memori untuk setiap file, ini tampaknya file yang cukup kecil (beberapa puluh kilobyte tidak terkompresi), jadi akan cukup untuk membaca data yang dikompresi ke dalam BytesIObuffer, lalu dekompresi dalam memori sebelum menulisnya ke file output. (Data terkompresi tidak pernah disimpan ke disk.)

Anda akan menambahkan impor ini:

import gzip
from io import BytesIO

dan loop utama Anda menjadi:

    for fileName in sinex_files:
        local_filename = os.path.join(sinex_userpath, fileName)
        if local_filename.endswith('.gz'):
            local_filename = local_filename[:-3]
        data = BytesIO()
        sinex_connetion.retrbinary('RETR '+ fileName, data.write, 1024)
        data.seek(0)
        uncompressed = gzip.decompress(data.read())
        with open(local_filename, 'wb') as file:
            file.write(uncompressed)

(Perhatikan bahwa file.close()tidak diperlukan.)