Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将大文件从.zip存档写入数据帧_Python_Pandas_Csv_Urllib_Zipfile - Fatal编程技术网

Python 将大文件从.zip存档写入数据帧

Python 将大文件从.zip存档写入数据帧,python,pandas,csv,urllib,zipfile,Python,Pandas,Csv,Urllib,Zipfile,这是一个下载zip文件的链接,其中包含英国政府国家统计局发布的1GB邮政编码级别数据: 有关数据的信息可在此处找到: 我在Python中的数据科学应用程序中使用了这些数据,将其加载到一个数据框架中。我已经将其集成到一个简单的网页中,并将其部署到云端。我不想将从AWS EC2实例访问的大型数据包含在我的存储库中。因此,据我所知,我有两种选择: 1) 将压缩文件包括在存储库中,并将CSV读取到数据框中 2) 打开url,在文件中传输并在脚本中提取,然后将CSV读入数据帧 这两种方法的问题是zip

这是一个下载zip文件的链接,其中包含英国政府国家统计局发布的1GB邮政编码级别数据:

有关数据的信息可在此处找到:

我在Python中的数据科学应用程序中使用了这些数据,将其加载到一个数据框架中。我已经将其集成到一个简单的网页中,并将其部署到云端。我不想将从AWS EC2实例访问的大型数据包含在我的存储库中。因此,据我所知,我有两种选择:

1) 将压缩文件包括在存储库中,并将CSV读取到数据框中

2) 打开url,在文件中传输并在脚本中提取,然后将CSV读入数据帧

这两种方法的问题是zip文件包含我需要的csv文件以外的内容,我不确定如何具体访问它

我考虑的另一种方法是,在将csv包含在存储库中之前,只压缩我需要的单个csv,但这似乎会生成多余的文件:

('Multiple files found in compressed zip file %s', "['NSPCL_AUG19_UK_LU.csv', '__MACOSX/', '__MACOSX/._NSPCL_AUG19_UK_LU.csv']") 
所以我也有同样的问题,不能直接指向我需要的文件


请让我知道什么是最佳做法,以及如何将我需要的文件放入Pandas数据框。

我不确定我是否理解您的问题,但一旦您将所需的csv加载到Pandas数据框中,您就可以使用

然后在加载它时

df = pandas.read_pickle('df1.gz', compression='gzip')
如果您不想将
gz
文件保存在硬盘上,可以将其在线存储在某个位置,然后使用
urllib
下载该文件,使用
gzip
解压该文件,最后将其解压:

from urllib.request import urlopen
import gzip
import pandas
import pickle

df = pickle.loads(gzip.decompress(urlopen('http://someUrl.com/file.gz').read()))

您可以执行以下操作来提取主csv文件并将其直接加载到数据帧中:

从urllib.request导入urlopen
导入zipfile,io
url='1〕https://www.arcgis.com/sharing/rest/content/items/19fac93960554b5e90840505bd73917f/data'
archive=zipfile.zipfile(io.BytesIO(urlopen(url.read()))#需要一些时间
csv_path='Data/NSPL_AUG_2019_UK.csv'#存档中所需的csv文件
df=pd.read_csv(io.BytesIO(archive.read(csv_path)))#需要一些时间
>>df
pcd pcd2 pcd。。。imd calncv stp
0 AB1 0AA AB1 0AA AB1 0AA。。。6808 S9999999 S9999999
1 AB1 0AB AB1 0AB AB1 0AB。。。6808 S9999999 S9999999
2 AB1 0AD AB1 0AD AB1 0AD。。。6808 S9999999 S9999999
3 AB1 0AE AB1 0AE AB1 0AE。。。5503 S9999999 S9999999
4 AB1 0AF AB1 0AF AB1 0AF。。。6668 S9999999 S9999999
...          ...       ...      ...  ...   ...        ...        ...
2632799 ZE3 9JW ZE3 9JW ZE3 9JW。。。4187 S9999999 S9999999
2632800 ZE3 9JX ZE3 9JX ZE3 9JX。。。4187 S9999999 S9999999
2632801 ZE3 9JY ZE3 9JY ZE3 9JY。。。4187 S9999999 S9999999
2632802 ZE3 9JZ ZE3 9JZ ZE3 9JZ。。。4187 S9999999 S9999999
2632803 ZE3 9XP ZE3 9XP ZE3 9XP。。。4187 S9999999 S9999999
[2632804行x 41列]
现在,您可以将数据帧单独存储在压缩文件中,正如iliar所建议的:

df.to_pickle('NSPL_AUG_2019_UK.pkl',compression='gzip')需要更多的时间
当我尝试这样做时,得到的文件大小约为69MB,因此在云中托管它应该不会有任何问题

要再次访问数据帧,只需加载pickle文件:

df=pd.read\u pickle('NSPL\u 2019年8月\u英国.pkl') pcd pcd2 pcd。。。imd calncv stp 0 AB1 0AA AB1 0AA AB1 0AA。。。6808 S9999999 S9999999 1 AB1 0AB AB1 0AB AB1 0AB。。。6808 S9999999 S9999999 2 AB1 0AD AB1 0AD AB1 0AD。。。6808 S9999999 S9999999 3 AB1 0AE AB1 0AE AB1 0AE。。。5503 S9999999 S9999999 4 AB1 0AF AB1 0AF AB1 0AF。。。6668 S9999999 S9999999 ... ... ... ... ... ... ... ... 2632799 ZE3 9JW ZE3 9JW ZE3 9JW。。。4187 S9999999 S9999999 2632800 ZE3 9JX ZE3 9JX ZE3 9JX。。。4187 S9999999 S9999999 2632801 ZE3 9JY ZE3 9JY ZE3 9JY。。。4187 S9999999 S9999999 2632802 ZE3 9JZ ZE3 9JZ ZE3 9JZ。。。4187 S9999999 S9999999 2632803 ZE3 9XP ZE3 9XP ZE3 9XP。。。4187 S9999999 S9999999 [2632804行x 41列]
您阅读了吗,讨论?@GurkiratSingh OP的问题可能不是如何在中读取csv文件,而是如何在AWS EC2实例中专门从zip文件中获取所需的csv文件而不占用大量磁盘空间。关于压缩单个csv,你使用了什么工具来压缩它,从而创建了多余的文件?@ytu我认为问题在于他不知道如何读取csv,因为zip文件包含多个csv文件以及操作系统元数据(OSX)。他的解决方案不应该花那么多磁盘钱,因为他可以在加载后删除。非常感谢您给出的完整答案。我以前见过“酸洗”这个词,但不知道它是什么
from urllib.request import urlopen
import gzip
import pandas
import pickle

df = pickle.loads(gzip.decompress(urlopen('http://someUrl.com/file.gz').read()))