一、Python读取文件
利用Python,可以方便地把文本内容转化为str
类型或以str
类型为基础元素的列表等格式,我们先来看一个以逗号为分隔符的简单文本文件:
# 3-2 job_chance.csv为提供的实战素材,请下载后,放置到本地的路径中,并更新file01。
file01 = r"E:\pythonclass\PythonDataAnalysisBlog\dataset3\3-2 job_chance.csv"
with open(file01, "r", encoding="utf-8") as f:
lines = f.read()
print(lines)
Out:
岗位,公司,地点,最低工资(万/月),最高工资(万/月)
php开发工程师,重庆赶海科技有限公司,重庆,0.6,0.8
java开发工程师,上海赛可出行科技服务有限公司,南京,1.5,2.5
测试工程师,朗新科技股份有限公司,无锡,0.6,1
web开发工程师,快助(天津)科技有限公司,天津,0.8,1
销售顾问,上海钢联电子商务股份有限公司,深圳,1,1.5
考虑到文件的分隔符为逗号,内容一共分为5列。文件的主体结构可以分为2块,第一行为标题,从第二行开始为文本具体内容。
# 导包
import pandas as pd
# 用readlines方法读取文本文件,读取为列表格式,并去除末尾的回车符号;
# 基于逗号分隔符,对每行进行处理分割为列表格式
with open(file01, "r", encoding="utf-8") as f:
lines = f.readlines()
content = [line.strip().split(",") for line in lines]
# 把嵌套列表读取为DataFrame格式,并分别指定表格内容与表格标题
df_job01 = pd.DataFrame(content[1:], columns=content[0])
df_job01
Out:
岗位 公司 地点 最低工资(万/月) 最高工资(万/月)
0 php开发工程师 重庆赶海科技有限公司 重庆 0.6 0.8
1 java开发工程师 上海赛可出行科技服务有限公司 南京 1.5 2.5
2 测试工程师 朗新科技股份有限公司 无锡 0.6 1
3 web开发工程师 快助(天津)科技有限公司 天津 0.8 1
4 销售顾问 上海钢联电子商务股份有限公司 深圳 1 1.5
从上面的操作过程看,我们在对文本的处理之前,需要了解文本的几个重要特征:编码格式、文本分隔符、是否需要额外指定列名称。另外,是否需要额外指定索引项也很关键。
二、Pandas读取文件
Pandas提供了多个读取表格型的文本文件,并转化为DataFrame对象的函数,其中用的最多的2个函数应该是read_csv和read_table。二者均提供了一个标准的方法,从文件型对象中记载带分隔符的数据,其中read_csv的默认分隔符为逗号,read_table的默认分隔符为制表符\t。
1、常规读取
例如对于上述文件,我们利用read_csv读成一个DataFrame:
# read_csv 会自动默认第一行为列名,并根据第一列的特别,默认是否设置为索引
df_job02 = pd.read_csv(file01, encoding="utf-8")
df_job02
Out:
岗位 公司 地点 最低工资(万/月) 最高工资(万/月)
0 php开发工程师 重庆赶海科技有限公司 重庆 0.6 0.8
1 java开发工程师 上海赛可出行科技服务有限公司 南京 1.5 2.5
2 测试工程师 朗新科技股份有限公司 无锡 0.6 1.0
3 web开发工程师 快助(天津)科技有限公司 天津 0.8 1.0
4 销售顾问 上海钢联电子商务股份有限公司 深圳 1.0 1.5
我们也可以手动在指定第一行为列名,第一列为索引列:
# index_col 用来指定用作索引的列编号,0表示第一列;
# header用来指定用作列名的编号,默认为0,表示取第一行,若不希望设置任何列名,则取None,程序默认配置以0开始序列作为列名;
df_job03 = pd.read_csv(file01, encoding="utf-8", index_col=0, header=0)
df_job03
Out:
公司 地点 最低工资(万/月) 最高工资(万/月)
岗位
php开发工程师 重庆赶海科技有限公司 重庆 0.6 0.8
java开发工程师 上海赛可出行科技服务有限公司 南京 1.5 2.5
测试工程师 朗新科技股份有限公司 无锡 0.6 1.0
web开发工程师 快助(天津)科技有限公司 天津 0.8 1.0
销售顾问 上海钢联电子商务股份有限公司 深圳 1.0 1.5
# 查看索引信息
df_job03.index
Out: Index(['php开发工程师', 'java开发工程师', '测试工程师', 'web开发工程师', '销售顾问'], dtype='object', name='岗位')
# 查看列名信息
df_job03.columns
Out: Index(['公司', '地点', '最低工资(万/月)', '最高工资(万/月)'], dtype='object')
read_table的用法和read_csv基本一致,如果你希望读取上述文件,只需要额外指定一下文件分隔符:
df_job04 = pd.read_table(file01, encoding="utf-8", index_col=0, header=0, sep=",")
df_job04
Out:
公司 地点 最低工资(万/月) 最高工资(万/月)
岗位
php开发工程师 重庆赶海科技有限公司 重庆 0.6 0.8
java开发工程师 上海赛可出行科技服务有限公司 南京 1.5 2.5
测试工程师 朗新科技股份有限公司 无锡 0.6 1.0
web开发工程师 快助(天津)科技有限公司 天津 0.8 1.0
销售顾问 上海钢联电子商务股份有限公司 深圳 1.0 1.5
2、函数语法分析
read_csv和read_table对文件读取的设置非常灵活,比如我们可以方便地跳过文件的若干行,或是针对超大文件只读取若干行,等等。我们来一起看一下函数的常用参数:
参数 说明
sep或delimiter 文件分隔符
header 用作列名的行号,默认为0,如果没有列名则设置为None
index_col 用作行索引的列编号
names 自定义的列名列表,结合header=None
skiprows 需要跳过读取的行数(从文件开始计算),或需要跳过的行号列表(从0开始)
nrows 仅读取开始的若干行
chunksize 指定文件块的大小(行数),逐块读取
encoding 指定unicode的文本编码格式
thousands 指定千分位分隔符,例如“,”
3、分块读取
处理这类超大文件的思路其实非常简单,我们按照一定的顺序分块读取,分批处理进而迭代即可,而这一功能在pandas里非常容易实现。
例如对于上面的文件,我只想读取2行:
# 设置norw参数
df_job05 = pd.read_csv(file01, encoding="utf-8", nrows=2)
df_job05
Out:
岗位 公司 地点 最低工资(万/月) 最高工资(万/月)
0 php开发工程师 重庆赶海科技有限公司 重庆 0.6 0.8
1 java开发工程师 上海赛可出行科技服务有限公司 南京 1.5 2.5
如果需要逐块读取,需要设置chunksize(行数)参数:
# 通过制定chunksize,函数返回一个可以迭代的文件读取器
chunker = pd.read_csv(file01, encoding="utf-8", chunksize=2)
chunker
Out:
# 可以通过循环进行迭代读取。这种方法对读取大文件很有优势。
for piece in chunker:
print(piece)
Out:
岗位 公司 地点 最低工资(万/月) 最高工资(万/月)
0 php开发工程师 重庆赶海科技有限公司 重庆 0.6 0.8
1 java开发工程师 上海赛可出行科技服务有限公司 南京 1.5 2.5
岗位 公司 地点 最低工资(万/月) 最高工资(万/月)
2 测试工程师 朗新科技股份有限公司 无锡 0.6 1
3 web开发工程师 快助(天津)科技有限公司 天津 0.8 1
岗位 公司 地点 最低工资(万/月) 最高工资(万/月)
4 销售顾问 上海钢联电子商务股份有限公司 深圳 1 1.5