python学习之路--pandas读写文件

上一期对于pandas的数据结构以及基本的增查删改进行了简单的介绍,这一期接着利用pandas进行读写文件。

1.读取文件

利用pandas读取文件主要用到的函数是read_xx(),读取后数据结构为dataframe,接下来对read_xx()进行一一讲解。

1.1 excel文件

pd.read_excel()可以用来读取excel文件,主要涉及到的参数有:

(1)sheet_name: excel文件中的表名

(2)index_col: 使用哪一列作为行索引,默认从0开始

(4)usecols: 读取表格中哪几列,必须是位置索引

(5)header: 哪一行设置为列索引,默认是第一行,即header = 0

(6)date_parser:解析日期的函数

(7)parse_dates:尝试将数据解析为日期,默认为False。如果为True,则尝试解析所有列。此外,还可以指定需要解析的一组列号或者列名

(8)names: 列索引

(9)engine: 默认是C,如文件路径存在中文时,engine= "python"

(10)encoding: 默认是utf-8,还可以是gbk

(11)skiprows: 跳过前几行读取文件,默认从0开始

(12)nrows: 读取多少行数据

(13) converters: 列名跟函数之间的映射关系组成的字典

import pandas as pd
df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",sheet_nam = 0,index_col = 0,nrows = 5)
print(df)

性别  年龄  省内省外   消费金额  贷款与否
用户id                            
1       男  60     1  311.0     0
2     NaN  25     1  220.0     1
3       男  47     1  246.0     0
4       女  52     0    NaN     0
5       女  21     0  916.0     0

sheet_name用来指定读取文件中哪个表格,可以是表格的名字或者是表格所在的位置,默认从0开始;

index_col指定用哪一列作为行索引,可以是具体的列名,也可以是列的位置索引,默认从0开始;

nrows就不用多说了,只读取多少行,为了方便查看数据的结构,示例只读取5行。

df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",index_col = "用户id",usecols = [0,1,2,4,5],nrows = 5)
print(df)

性别  年龄   消费金额  贷款与否
用户id                      
1       男  60  311.0     0
2     NaN  25  220.0     1
3       男  47  246.0     0
4       女  52    NaN     0
5       女  21  916.0     0

usecols指定读取列,须是列的位置索引,默认从0开始;

header指定哪一行设置为列索引,默认为0,还可以是1或者None;

 #以header = 0,以第一行为列索引
df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",header = 0,nrows = 5)  
print(df)

用户id   性别  年龄  省内省外   消费金额  贷款与否
0     1    男  60     1  311.0     0
1     2  NaN  25     1  220.0     1
2     3    男  47     1  246.0     0
3     4    女  52     0    NaN     0
4     5    女  21     0  916.0     0

#以header = 1,以第二行为列索引
df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",header = 1,nrows = 5)   
print(df)

1    男  60  1.1    311  0
0  2  NaN  25    1  220.0  1
1  3    男  47    1  246.0  0
2  4    女  52    0    NaN  0
3  5    女  21    0  916.0  0
4  6    男  37    0  980.0  1

header = None,表明不以表格的行为列索引,即没有表头,默认从0开始,如原来表格有列索引,则原来索引变为第一行数据;

df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",header = None,nrows = 5) 
print(df)

0    1   2     3     4     5
0  用户id   性别  年龄  省内省外  消费金额  贷款与否
1     1    男  60     1   311     0
2     2  NaN  25     1   220     1
3     3    男  47     1   246     0
4     4    女  52     0   NaN     0

列名的设置,可以通过header = None搭配names参数来重设,或者header = None搭配df.columns()来设置;

skiprows,跳过前几行读取;

df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",header = None,nrows = 5,skiprows = 1,names = ["用户id","性别","年龄","省内外情况","消费情况","贷款情况"]) 
print(df)

用户id   性别  年龄  省内外情况   消费情况  贷款情况
0     1    男  60      1  311.0     0
1     2  NaN  25      1  220.0     1
2     3    男  47      1  246.0     0
3     4    女  52      0    NaN     0
4     5    女  21      0  916.0     0

因为原来的表格有表头,因此用header = None时,原来的表头会变成第一行数据,因此使用skiprows =1,跳过了第一行的读取。

df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",header = None,nrows = 5,skiprows = 1) 
df.columns = ["用户id","性别","年龄","省内外情况","消费情况","贷款情况"]
print(df)

用户id   性别  年龄  省内外情况   消费情况  贷款情况
0     1    男  60      1  311.0     0
1     2  NaN  25      1  220.0     1
2     3    男  47      1  246.0     0
3     4    女  52      0    NaN     0
4     5    女  21      0  916.0     0

1.2 csv文件

csv文件是以逗号为分隔符的文件,读取参数与excel基本类似,与excel的读取不一样的地方在于如遇到中文路径必须得设置engine参数;

文件为gbk格式的csv,若不设置encoding参数,会报错,并且文件路径带有中文,需要设置engine参数,不然也会报错;

df = pd.read_csv(r"D:\迅雷下载\示例gbk.csv",encoding = "gbk",engine = "python")
print(df)

用户id   性别    年龄  省内省外   消费金额  贷款与否
0      1    男  60.0     1  311.0   0.0
1      2  NaN  25.0     1  220.0   1.0
2      3    男  47.0     1  246.0   0.0
3      4    女  52.0     0    NaN   0.0
4      5    女  21.0     0  916.0   0.0
5      6    男  37.0     0  980.0   1.0
6      7    男  34.0     0  482.0   1.0
7      8    男   NaN     0  267.0   0.0
8      9    女  50.0     1    NaN   0.0
9     10    男  20.0     1  265.0   1.0
10    11    男  51.0     1  612.0   0.0
11    12    男  31.0     0  704.0   0.0
12    13    女   NaN     0  529.0   1.0
13    14    女  18.0     1  528.0   1.0
14    15    女  22.0     0  328.0   NaN
15    16    女  45.0     0  647.0   0.0
16    17  NaN  52.0     0  860.0   0.0
17    18    男  50.0     1  779.0   0.0
18    19    男  59.0     0  750.0   1.0
19    20    男  23.0     0  597.0   0.0

encoding默认是utf-8格式,根据需要还可能是gbk,示例就是gbk格式;

engine指定读取引擎,默认是c语言,如有路径有中文,需设置为python,python引擎更为全面;

1.3 txt文件

txt文件是以指制表符\t为分隔符的文件,读取时用到read_table来读取,参数与excel、csv基本类似,不同的地方在于必须要指定sep。

df = pd.read_csv(r"D:\迅雷下载\示例txt.txt",encoding = "gbk",engine = "python",sep = "\t",nrows= 5,index_col = "用户id")
print(df)

性别  年龄  省内省外   消费金额  贷款与否
用户id                            
1       男  60     1  311.0     0
2     NaN  25     1  220.0     1
3       男  47     1  246.0     0
4       女  52     0    NaN     0
5       女  21     0  916.0     0

2. 写入文件

2.1写入文件

excel,csv,txt写入文件的方式基本类似,以pandas的to_xx()方式写入;因为三者类似,这里只用excel格式来示例。

(1)index: 是否保留行索引

(2)columns: 通过列索引指定所需列

(3)sheet_name: 表名

(4)encoding:编码格式,utf-8或者gbk

(5)na_rep: 缺失值填充

(6)inf_rep:无穷值填充

(7)index_label: 行索引标签

(8)header: 默认为True,False没有列索引,如需更改列名,则header = ["列1","列2","列3"]

df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",sheet_nam = 0,nrows = 5)
df.to_excel(r"C:\Users\wenjianhua\Desktop\示例20190322.xlsx",index = False,columns = ["用户id","性别","消费金额","贷款与否"],
           encoding = "utf-8",sheet_name = "示例",na_rep = "Na",inf_rep = "Na")

to_csv时需记得设置sep参数!

2.2 多个表写入同个文件

多个数据表需同时写入一个文件时,需用到pandas的ExcelWriter。 步骤如下:

writer = pd.ExcelWriter(path,engine = "xlsxwriter")
df1.to_excel(writer,sheet_name = "XX")
df2.to_excel(writer,sheet_name = "XX")
df3.to_excel(writer,sheet_name = "XX")
writer.save()
##我们举例说明一下
df1 = pd.read_excel(r"D:\迅雷下载\示例.xlsx",sheet_nam = 0,nrows = 5)
df2 = pd.read_excel(r"D:\迅雷下载\示例.xlsx",sheet_nam = 0,nrows = 5)
df3 = pd.read_excel(r"D:\迅雷下载\示例.xlsx",sheet_nam = 0,nrows = 5)
writer = pd.ExcelWriter(r"D:\迅雷下载\示例1.xlsx",engine = "xlsxwriter")
df1.to_excel(writer,sheet_name = "示例1")
df2.to_excel(writer,sheet_name = "示例2")
df3.to_excel(writer,sheet_name = "示例3")
writer.save()

3.批量读取文件

很多时候我们会遇到数据表结构类似,甚至结构相同的文件。处理时如果一个一个的读取,那就太慢了,不符合使用python的我们的风格,我们可以使用循环将多个类似的数据表同时读取,如:

import os
import pandas as pd
frame = []
path = r"C:\Users\wenjianhua\Desktop\example"
for file in os.listdir(path):
    filepath = path + "\\" + file
    print(filepath)
    frame.append(pd.read_csv(filepath,usecols = [0,1,2,3]))

df = pd.concat(frame,ignore_index = True)
print(df.head(10))

C:\Users\wenjianhua\Desktop\example\order-14.3.csv
C:\Users\wenjianhua\Desktop\example\order.csv
       商品ID       类别ID  门店编号     单价
0  30006206  915000003  CDNL  25.23
1  30163281  914010000  CDNL   2.00
2  30200518  922000000  CDNL  19.62
3  29989105  922000000  CDNL   2.80
4  30179558  915000100  CDNL  47.41
5  30022232  960000000  CDNL   0.30
6  30179520  915000100  CDNL  77.52
7  30184351  915000106  CDNL  15.57
8  30184351  915000106  CDNL  15.58
9  29989059  922000003  CDNL   1.98
发布了33 篇原创文章 · 获赞 30 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/d345389812/article/details/88780624