常见数据文件存储和读取

当我们使用 Python 读取数据文件时,首先推荐的就是通过 Pandas 完成,Pandas 几乎支持所有常见的数据文件格式。

数据类型文件格式读取方式存储方式
文本CSVread_csvto_csv
文本JSONread_jsonto_json
文本HTMLread_htmlto_html
文本剪切板read_clipboardto_clipboard
二进制MS Excelread_excelto_excel
二进制HDF5 格式read_hdfto_hdf
二进制Feather 格式read_featherto_feather
二进制Parquet 格式read_parquetto_parquet
二进制Msgpackread_msgpackto_msgpack
二进制Stataread_statato_stata
二进制SASread_sasto_sas
二进制Python Pickle 格式read_pickleto_pickle

Excel 和 CSV 格式

上面的表格中,相信你最熟悉的是 Excel 表格数据文件。由于 Excel 表格有最大的行数储存限制(16,384 列 × 1,048,576 行),所以更多时候我们会使用 CSV 来储存表格数据。

CSV 的英文是 Comma-Separated Values,其实就是通过字符分割数据并以纯文本形式存储。这里的分割字符我们一般会使用逗号,所以往往也称 CSV 文件为逗号分隔符文件。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据,也没有最大行数的储存限制。

下面,我们尝试读取 Excel 和 CSV 格式的示例数据文件。首先,我们需要生成不同类型的数据示例文件。下面这段代码直接点击运行即可,将会在目录下方生成两个最常用的数据文件 test.csvtest.xlsx

教学代码

In [1]:

import numpy as np
import pandas as pd# 生成示例数据
df = pd.DataFrame({'A': np.random.randn(10), 'B': np.random.randn(10)})# 写入数据文件
df.to_csv('test.csv', index=None)  # CSV
df.to_excel('test.xlsx', index=None)  # EXCEL
print("*****示例文件写入成功*****")
*****示例文件写入成功*****
# 在此import numpy as np
import pandas as pd
import numpy as np
# 生成示例数据
df = pd.DataFrame({'A': np.random.randn(10), 'B': np.random.randn(10)})# 写入数据文件
df.to_csv('test.csv', index=None)  # CSV
df.to_excel('test.xlsx', index=None)  # EXCEL
print("*****示例文件写入成功*****")*****示例文件写入成功*****

下面,我们学习使用 Pandas 读取文件的方法,直接运用上面表格中的 API 即可。CSV 文件读取是 read_csv ,而 Excel 文件读取是 read_excel

pfc=pd.read_csv("test.csv")
print(pfc)A         B
0 -0.631166  0.618370
1  0.830369 -1.100556
2 -1.705350  0.253452
3  0.569138 -0.809670
4  1.358868 -0.949296
5  0.873989  0.759465
6 -0.024066  0.893342
7 -0.056798  2.006965
8  0.294654 -0.904885
9  0.897250 -0.346867
pdd=pd.read_excel('test.xlsx')
print(pdd)A         B
0 -0.631166  0.618370
1  0.830369 -1.100556
2 -1.705350  0.253452
3  0.569138 -0.809670
4  1.358868 -0.949296
5  0.873989  0.759465
6 -0.024066  0.893342
7 -0.056798  2.006965
8  0.294654 -0.904885
9  0.897250 -0.346867

当你读取 Excel 文件时,首先需要安装 openpyxl 模块,不然就会报错。安装该模块的命令为:pip install openpyxl。在线环境中,我们已经为你安装好了该模块。

pd.read_excel('test.xlsx')
AB
0-0.6311660.618370
10.830369-1.100556
2-1.7053500.253452
30.569138-0.809670
41.358868-0.949296
50.8739890.759465
6-0.0240660.893342
7-0.0567982.006965
80.294654-0.904885
90.897250-0.346867

你可以发现,通过 Pandas 读取处理的数据会自动以表格样式呈现,这也就是 Pandas 特有的数据格式:DataFrame。在学习数据分析的生涯中,DataFrame 将会成为你最容易听到的名词之一。Pandas 的所有数据操作都是针对于 DataFrame 进行。

特别地,我们会将 Pandas 中的一维数据类型称之为 Series,三维数据称之为 Panel。但实际上,它们都可以看作是特殊的 DataFrame。

HDF5 格式

HDF(英语:Hierarchical Data Format)指一种为存储和处理大容量科学数据设计的文件格式及相应库文件。HDF5 格式的特点在于能存储多个数据集,并且支持 metadata

HDF5 文件包含两种基本数据对象:

  • 群组(group):类似文件夹,可以包含多个数据集或下级群组。
  • 数据集(dataset):数据内容,可以是多维数组,也可以是更复杂的数据类型。

群组和数据集都支持元数据 metadata,用户可以自定义其属性,提供附加信息。元数据类似于「数据的数据」,它能够用来说明数据的特征和其他属性。

HDF5 的好处在于,你不仅可以使用 Python 存储和读取,目前还被 Java,MATLAB/Scilab,Octave,IDL,Julia, R 等语言或商业软件支持。

下面,我们同样尝试使用 Pandas 来存储和读取 HDF5 数据。和 Excel 文件读取相似,我们需要先安装一个依赖模块 PyTables,命令为:pip install tables

df1 = pd.DataFrame({'A': np.random.randn(10), 'B': np.random.randn(10)})  # 随机数据
df2 = pd.DataFrame({'C': np.random.randn(10), 'D': np.random.randn(10)})  # 随机数据df1.to_hdf('test.h5', key='df1')  # 存储 df1
df2.to_hdf('test.h5', key='df2', format='table')  # 存储 df2 

上面的代码中,我们通过指定 key 向 HDF 文件中存储了 2 个不同的数据集 df1df2。那么,接下来我们尝试读取。

pd.read_hdf('test.h5', key='df1')  # 读取 df1 

如果你仔细观察,你会发现上面我们在存储示例数据时,df2 后面指定了 format='table' 参数。这是因为,HDF 支持两种存储架构:fixed 和 table。默认为 fixed,因为其读取速度更快,但是 table 却支持查询操作。

# 读取 df2 中 index < 5 的数据
pd.read_hdf('test.h5', key='df2', where=['index < 5'])

你可能会觉得,HDF5 既然支持存储多个数据集,是不是类似于数据库中的「表」呢?值得注意的是,HDF5 并不是数据库,如果多个使用者同时写入数据,数据文件会遭到破坏。

JSON 格式

JSON(英文:JavaScript Object Notation)是一种由道格拉斯·克罗克福特构想和设计、轻量级的数据交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。尽管 JSON 是 JavaScript 的一个子集,但 JSON 是独立于语言的文本格式。

JSON 数据格式与语言无关,脱胎于 JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json

这里特别说到 JSON 格式,原因是其已经成为了 HTTP 请求过程中的标准数据格式。而后面的采集数据过程中,我们会学习到通过 API 请求数据,一般都会对 JSON 进行解析。所以,这里先行了解学习。

下面,我们给出一段 JSON 的示例数据:

obj = """ 
[{"aqi": 46,"area": "成都","pm2_5": 32,"pm2_5_24h": 33,"position_name": "金泉两河","primary_pollutant": null,"quality": "优","station_code": "1431A","time_point": "2018-09-05T09:00:00Z"},{"aqi": 29,"area": "成都","pm2_5": 20,"pm2_5_24h": 26,"position_name": "十里店","primary_pollutant": null,"quality": "优","station_code": "1432A","time_point": "2018-09-05T09:00:00Z"}
]
"""

JSON 数据中 key 必须是字符串类型,缺失值用 null 表示。其中还可能包含的基本类型有:字典,列表,字符串,数值,布尔值等。

Pandas 中的 read_json 往往能直接把 JSON 解析为 DataFrame。

pd.read_json(obj)

上面的结果是不是看起来非常舒服,DataFrame 的确是最佳的数据呈现格式。不过,由于 JSON 支持复杂的嵌套,有时候直接通过 read_json 读取到的 DataFrame 并不是我们想要的样子,例如某个键值是以字典或列表存在。此时,我们就会用其他的工具来解析 JSON 了。

Python 中有许多能够储存和解析 JSON 的库,这里推荐使用内建库 json。上面给出的 obj 其实是字符串,如果想要将其转换为 Python 的数据类型(Python Object),那么就可以使用 json.loads(obj) 完成。

import jsonobj = json.loads(obj)
obj

现在,你就可以使用 Python 对字典、列表等操作方法来对上面的 obj 进行处理了。例如,我们想读取「金泉两河」地名。

obj[0]['position_name']

除此之外,使用 json.dumps 可以把 Python Object 转换为 JSON 类型。

json.dumps(obj)

read_ 操作参数详解

Pandas 中的 read_ 操作可不仅仅是加载数据文件这么简单,它带有的一些参数可以实现更加个性化的读取结果。我们以 pandas.read_csv() 的 API 为例。

pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, doublequote=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)

上面的参数可能让你看到眼花缭乱,我们挑几个重要的介绍。

  • path:路径不仅仅可以读取本地文件,还支持远程 URL 链接。
  • sep:支持按特定字符分割。
  • header:可以指定某一行为列名,默认是第一行。
  • names:自定义列名。
  • skiprows:指定忽略某些行。
  • na_values:对空值进行指定替换操作。
  • parse_dates:尝试将数据解析为日期。
  • nrows:读取指定行数的数据。
  • chunksize:指定分块读取数据大小。
  • encoding:指定文件编码。

上面的这些参数使得 Pandas 的数据文件读取功能非常强大。例如,如果你的 CSV 文件是使用分号 ; 而不是逗号 , 分割,那么就可以通过 sep=';' 让数据加载为正常的 DataFrame 格式。

除此之外,像 skiprows 非常常用,它可以指定忽略某些行。,使得在加载数据时就可以对数据实现过滤,面对庞大且加载较慢的数据文件时特别好用。我们拿上面的示例数据举例。

In [ ]:

pd.read_csv("test.csv", skiprows=range(1, 5))  # 忽略前 4 行的数据

分块读取数据

这里,我们特别介绍一下分块读取的方法。在很多时候,手中的数据集都非常大。例如当我们直接读取一个 GB 级别的 CSV 文件时,不仅速度很慢,还有可能因为内存不足而报错。此时,通过分块读取的方式加载数据文件就非常方便了。

通过上面的 read_ 参数可以看出,分块读取需要指定 chunksize,也就是每一块的大小。究竟该怎么做,我们来试一下。

chunker = pd.read_csv("test.csv", chunksize=2)
chunker

chunker 返回的 pandas.io.parsers.TextFileReader 是一个可迭代对象。你可以通过 get_chunk() 逐次返回每一个块状数据的内容。你可以尝试多次运行下方单元格,以查看每次迭代的结果。

chunker.get_chunk()  # 迭代返回分块数据内容

分块读取是解决大文件读取慢的有效手段,但需要注意 chunksize 并不是 Pandas 中每个 read_ 操作都支持的参数,这需要你在使用时通过官方文档确认。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ios上传图片旋转问题解决方案(vant上传图片)

使用 van-uploader(vant 组件库上传图片组件)上传图片时&#xff0c; 部分 ios 机型&#xff0c;会偶发从手机上传图片后&#xff0c;图片预览中&#xff0c;图片旋转了 90 度的问题。 对于该问题&#xff0c;vant 官网中也给出了解决方案。 但官网中的方案适配的是单选情况下…

编译原理:NFA转DFA(原理+完整代码+可视化实现)

NFA转换为DFA 【本文内容摘要】 什么是DFA通过子集构造法将NFA转换为DFA生成DFA的dot文件并且形成可视化。 如果本文对各位看官有用的话&#xff0c;请记得给一个免费的赞哦&#xff08;收藏也不错&#xff09;&#xff01; 文章目录 NFA转换为DFA一、什么是DFA二、NFA转换为…

【GO】protobuf在golang中的测试用例

上篇文章介绍了如何安装protobuf环境&#xff0c;文章链接如下 【Go】protobuf介绍及安装-CSDN博客 本节介绍protobuf在gRPC中具体如何使用&#xff0c;并编写测试用例 一、Protobuf是如何工作的 .proto文件是protobuf一个重要的文件&#xff0c;它定义了需要序列化数据的结…

企业微信配置可信域名

首先去申请一个域名&#xff0c;然后将域名绑定到有公网ip的云服务器上&#xff0c;绑定到具体的网站&#xff1b;然后再企业微信&#xff0c;管理后台&#xff0c;点击具体的应用&#xff0c;进【网页授权及JS-SDK】&#xff1b;点击底部的【申请校验域名】点击下载文件&#…

postgresql pg_hba.conf 配置详解

配置文件之pg_hba.conf介绍 该文件用于控制访问安全性&#xff0c;管理客户端对于PostgreSQL服务器的访问权限&#xff0c;内容包括&#xff1a;允许哪些用户连接到哪个数据库&#xff0c;允许哪些IP或者哪个网段的IP连接到本服务器&#xff0c;以及指定连接时使用的身份验证模…

第73讲:深入理解MySQL数据库InnoDB存储引擎:内存结构、磁盘结构与后台线程全面解析

文章目录 1.InnoDB存储引擎的架构2.InnoDB存储引擎的内存结构2.1.Buffer Pool缓冲池2.2.Change Buffer更改缓冲区2.3.自适应Hash索引2.4.Log Buffer日志缓冲区 3.InnoDB存储引擎的磁盘结构3.1.System Tablespace系统表空间3.2.File-Per-Table Tablespaces每个表都有单独的表空间…

ES6箭头函数和js普通函数的区别整理

普通函数的this指向为&#xff1a;谁调用它this就指向谁&#xff0c;this被不同对象调用是会变的 箭头函数的this指向为&#xff1a;声明该箭头函数时&#xff0c;外层第一个普通函数的this指向谁就固定为谁&#xff0c;不会改变 function foo() {console.log(this)}const ob…

红警For Mac(RAM芯片可玩)

1、文件损坏解决版本&#xff01; 执行以下命令&#xff0c;&#xff08;注意&#xff1a;命令2应用路径根据实际情况修改&#xff09; sudo spctl --master-disable sudo xattr -r -d com.apple.quarantine /Applications/红警2尤里复仇M芯片.app2、新系统14&#xff0c;第一…

Oracle Flashback示例集锦

Flashback Table 本例参考Rewind a Table Using Oracle Flashback Table Flashback Table&#xff0c;Flashback Query和Flashback Drop的示例合集可参见这里 首先获得当前的时间&#xff0c;或当前的SCN&#xff0c;以便后续回退使用 -- 获取SCN法1 select DBMS_FLASHBACK.…

孩子都能学会的FPGA:第二十一课——用线性反馈移位寄存器实现伪随机序列

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

腾讯云轻量应用服务器怎么使用宝塔面板?

腾讯云轻量应用服务器宝塔面板怎么用&#xff1f;轻量应用服务器如何安装宝塔面板&#xff1f;在镜像中选择宝塔Linux面板腾讯云专享版&#xff0c;在轻量服务器防火墙中开启8888端口号&#xff0c;然后远程连接到轻量服务器执行宝塔面板账号密码查询命令&#xff0c;最后登录和…

采集伪原创洗稿,实现文章创作的方法

各位写手小伙伴们&#xff0c;今天要和大家分享一些关于伪原创的方法和经验&#xff0c;希望这些建议能够在你们的写作之旅中派上用场。 首先我们需要明确一下&#xff0c;伪原创并不是鼓励抄袭&#xff0c;而是一种在保留原文核心思想的同时&#xff0c;通过巧妙的方式改写&a…

Qt应用开发(Quick篇)——布局类与布局模块

一、前言 实际 应用中&#xff0c;布局是常用的功能&#xff0c;布局最直观的就是提供空间使用率&#xff0c;改善空间的流动和模块之间的重叠&#xff0c;让界面更加的美观。 二、布局类Layout 2.1 介绍 将Layout类型的对象附加到布局的子元素上&#xff0c;提供有关该项的特…

在AWS Lambda上部署标准FFmpeg工具——自定义层的方案

大纲 1 确定Lambda运行时环境1.1 Lambda系统、镜像、内核版本1.2 运行时1.2.1 Python1.2.2 Java 2 打包FFmpeg3 创建Lambda的Layer4 测试4.1 创建Lambda函数4.2 附加FFmpeg层4.3 添加测试代码4.4 运行测试 参考文献 FFmpeg被广泛应用于音/视频流处理领域。对于简单的需求&#…

阿里云Arthas使用——在日志没有输出异常情况下,如何进行线上bug定位 stack命令 和 trace命令

前言 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;类…

FreeRTOS-Plus-CLI移植

FreeRTOS-Plus-CLI移植 Fang XS.1452512966qq.com如果有错误&#xff0c;希望被指出&#xff0c;学习技术的路难免会磕磕绊绊量的积累引起质的变化 介绍 FreeRTOS-Plus-CLI是FreeRTOS的组件之一。FreeRTOS-Plus-CLI提供了一种简单、小巧、可扩展且RAM高效的启用方法方便Free…

JS的监听事件

在JavaScript中&#xff0c;你可以使用监听器来捕获和处理不同类型的事件。通过添加事件监听器&#xff0c;你可以指定当特定事件发生时要执行的函数。 以下是几种常见的监听事件的方法&#xff1a; 1. addEventListener()&#xff1a;用于在目标元素上添加事件监听器。它接受…

解决 IIS HTTP 403 错误问题

最近上传附件 IIS 总是返回 HTTP 403 错误,在踩了很多配置的坑之后,终于把问题解决了,于是特意写了本篇文章。 虽然网络上的文章不少,大都写的没错,但是他们没有很清晰的把问题描述清楚,导致一些新手在看这些文章跟着处理问题的时候难免会踩坑,于是我就以我踩坑的经验写…

分享67个节日PPT,总有一款适合您

分享67个节日PPT&#xff0c;总有一款适合您 67个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1oU-UUCV_69e8Gp5Y6zrzVA?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

使用Python发送HTTP请求的最佳实践:让你的代码锐利如刀!

在当今的数字化时代&#xff0c;使用Python发送HTTP请求已经成为了许多开发人员的日常任务。无论是进行API交互、网页爬取&#xff0c;还是构建网络服务&#xff0c;掌握Python的HTTP请求技巧都至关重要。但是&#xff0c;要想在竞争激烈的编程领域中脱颖而出&#xff0c;你需要…