gpt4 book ai didi

Python:用于下载有效 .zip 文件的跨平台代码

转载 作者:可可西里 更新时间:2023-11-01 11:24:55 24 4
gpt4 key购买 nike

我需要从网站下载并解压缩文件。这是我正在使用的代码:

    #!/usr/bin/python

#geoipFolder = r'/my/folder/path/ ' #Mac/Linux folder path
geoipFolder = r'D:\my\folder\path\ ' #Windows folder path
geoipFolder = geoipFolder[:-1] #workaround for Windows escaping trailing quote
geoipName = 'GeoIPCountryWhois'
geoipURL = 'http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip'

import urllib2
response = urllib2.urlopen(geoipURL)

f = open('%s.zip' % (geoipFolder+geoipName),"w")
f.write(repr(response.read()))
f.close()

import zipfile
zip = zipfile.ZipFile(r'%s.zip' % (geoipFolder+geoipName))
zip.extractall(r'%s' % geoipFolder)

此代码适用于 Mac 和 Linux 机器,但不适用于 Windows。在那里,写入了 .zip 文件,但脚本抛出此错误:

    zipfile.BadZipfile: File is not a zip file

我也无法使用 Windows 资源管理器解压缩文件。它说:

    The compressed (zipped) folder is empty.

但是磁盘上的文件有 6MB 大。

关于我在 Windows 上做错了什么的想法?

谢谢

最佳答案

您的 zip 文件在 Windows 上已损坏,因为您正在以写入/文本模式打开文件(行终止符转换会破坏二进制数据):

f = open('%s.zip' % (geoipFolder+geoipName),"w")

您必须像这样以写入/二进制模式打开:

f = open('%s.zip' % (geoipFolder+geoipName),"wb")

(当然仍然可以在 Linux 上工作)

总而言之,一种更 pythonic 的方式,使用 with block (并删除 repr):

with open('{}{}.zip'.format(geoipFolder,geoipName),"wb") as f:
f.write(response.read())

编辑:无需将文件写入磁盘,您可以使用 io.BytesIO,因为 ZipFile 对象接受文件句柄作为第一个参数。

import io
import zipfile

with open('{}{}.zip'.format(geoipFolder,geoipName),"wb") as f:
outbuf = io.BytesIO(f.read())

zip = zipfile.ZipFile(outbuf) # pass the fake-file handle: no disk write, no temp file
zip.extractall(r'%s' % geoipFolder)

关于Python:用于下载有效 .zip 文件的跨平台代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40979145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com