数据获取:文件读取

一、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

你可能感兴趣的:(数据获取:文件读取)