mengekstrak file terkompresi dari ekstensi .gz sambil mengunduhnya dari server ftp [duplikat]
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
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 BytesIO
buffer, 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.)