根据官方文档提供的说明(IOTools),Pandas支持常用的文本格式数据(csv、json、html、剪贴板)、二进制数据(excel、hdf5格式、Feather格式、Parquet格式、Msgpack、Stata、SAS、pkl)、SQL数据(SQL、谷歌BigQuery云数据),各类型数据处理的方法如下表:
数据类型 | 描述符 | 读方法 | 写方法 |
---|---|---|---|
text | CSV | read_csv | to_csv |
text | JSON | read_json | to_json |
text | HTML | read_csv | to_csv |
text | 剪贴板 | read_clipboard | to_clipboard |
二进制 | Excel | read_excel | to_excel |
二进制 | HDF5 | read_hdf | to_hdf |
二进制 | PKL | read_pickle | to_pickle |
SQL | SQL | read_sql | to_sql |
下面详细介绍常用的csv、txt、excel、json、pkl格式文件的读写操作。
- 对csv和txt格式的读写,read_csv()方法兼容,因为这两种格式的数据本质上的形式都是数据加分隔符,旧版本的read_table()方法已经整合到read_csv()方法中,即指定分隔符为'\t',代码如下:
import pandas as pd
# 读取csv文件
pd.read_csv('/home/root/foo.csv')
# 读取txt文件
pd.read_csv('/home/root/bar.txt')
- read_csv()常用的几个参数说明:
- sep: 分割符,csv和txt默认为',', 但是有些数据集里面可能是空格或者'\t';
- header: 表头,int或者int的列表,默认为'infer',即需要制定某一行作为数据的列名;
- iterator: 为True的话返回的是文件读取对象,可以用迭代的方法或者get_chink()方法去读取;
- index_col: int,队列或者布尔类型,用于作为行标签的列;
- prefix: str类型,当未制定表头时给列加上的前缀;
- dtype: type名称或者是列名和类型的映射关系字典,例如:{'a': np.float64, 'b': np.int32, 'c': ‘Int64’};
- engine: 制定读取文件的引擎类型{'c', 'python'}, 使用C语言速度更快,python引擎速度慢点但是功能更完善;
- nrows: 指定要读取的行数;
- encoding: 指定文件的编码格式;
- error_bad_lines: 带太多空格的列会引发异常,设置为True的时候会删除这些异常列;
- low_memory: 默认为True,限制每次读取文件块大小,避免读操作占用太多内存, 置为False在实际使用过程中反而读取文件更慢,可能是内存占用过高影响到磁盘IO的操作;
- csv和txt类型数据集读取前通常还需要进行编码判断以及分隔符判断:
# 编码判断方法
def encode_judge(file_dir):
charset = 'utf8'
file_ext = file_dir.rsplit('.', 1).pop().lower()
if file_ext in ('csv', 'txt', 'xls', 'xlsx'):
for i in ('utf8', 'gb18030', 'latin'):
try:
with open(file_dir, "r", encoding=i) as file:
file.read(1024 * 1024 * 10)
charset = i
break
except:
pass
return charset
# 分隔符判断方法
def get_sep(lines):
result = ','
for sep in (',', '\t', ' '):
if sep in lines:
result = sep
break
return result
- 对xls和xlsx格式的读写,调用read_excel():, read_table()的参数和read_csv()大体一致就是少了iterator参数,因为excel为二进制编码格式文件不支持迭代方式读取, 代码如下:
# 借用xlrd这个包可以提高读取excel格式的兼容性能
# 读取前也参照上面的编码检测操作
import xlrd
content = xlrd.open_workbook(filename=file_dir, encoding_override=charset)
pd.read_excel(content, engine='xlrd')
对于其他文件的读取可参照上面列表以及官方文档说明,text类型的文件一般支持迭代方式读取,二进制文件只能一次性读取, sql读取和pkl的读取在下篇文章中更新。