数据获取:文件读取

一、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: <pandas.io.parsers.TextFileReader at 0x23ef6a1f668>

# 可以通过循环进行迭代读取。这种方法对读取大文件很有优势。
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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356