python几种文件操作,默认,os,pandas,numpy
python自带的文件读写 :
- 形式:f=open("dir","r")+操作+f.close()
- r只读;r+读写;rb以二进制只读,适用图片等
- 简化的方式: with open ('dir','r') as f+操作,这种方式相当于tyr catch+close
- 操作方法
- f.read(size) 读多少字节;
- f.readline();
- f.next() 返回文件下一行;
- f.write(str);
os模块操作 文件和目录 :
- os.chdir(path)改变当前工作目录
-
os.remove(path)删除路径为path的文件
-
os.rename(src, dst)重命名文件或目录,从 src 到 dst
-
os.renames(old, new)递归地对目录进行更名,也可以对文件进行更名。
-
os.mkdir(path[, mode])以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)
-
os.rmdir(path)删除path指定的空目录
-
os.removedirs(path)递归删除目录
pandas模块读取 文件:
- read_csv(),读取带有分隔符的数据,默认分隔符是逗号,返回一个数据框。不只csv,txt也可读,但必须要指定sep。
- read_excel(),默认分隔符是逗号
- read_table(),常用来读取txt,默认分隔符为制表符("\t")
- 读取spss,数据库等也有函数
- 写:to_csv()等
- 123的参数:
data.txt 1,2,3,4,python
5,6,7,8,java
9,10,11,12,c++
- header:标题,默认第一行为标题。若不想要标题,header=None。
- names:列索引,例:data2 = pd.read_csv("data.txt",names=["a","b","c","d","name"])
a b c d name
0 1 2 3 4 python
1 5 6 7 8 java
2 9 10 11 12 c++
会发现多了标题和默认的行索引
- index_col:使用哪一列作为行索引,默认会使用从0开始的整数索引。例data3=pd.read_csv("data2.txt",index_col="name")
a b c d
name
python 1 2 3 4
java 5 6 7 8
c++ 9 10 11 12
- sheet_name: excel文件中的表名
- skiprows:跳行读取文件,例:skiprows=[0,3,5]或skiprows=1
- nrows: 读取多少行数据
- encoding: 默认是utf-8,还可以是gbk
- usecols: 读取表格中哪几列,必须是位置索引。例:usecols = [0,1,2,4,5]
- na_values:设置需要将值替换成NaN的值。例:na_values=["java","c++"]
name a b c d 0 NaN 1.0 NaN 3.0 4.0 1 java 5.0 6.0 NaN NaN 2 NaN NaN 10.0 NaN NaN
如果想将某个值替换成为NaN,但是可能有多个列都包含了这个值,而我们却不想替换所有的列,我们可以通过一个字典的形式来设置na_values参数,字典的键就是列索引,值就是你要替换的值。例:只将第一列的python和c++替换为NaN
dic = {"name":["python","c++"]} data = pd.read_csv("data.txt",na_values=dic) print(data) name a b c d 0 NaN 1.0 1.0 3 4 1 java 5.0 6.0 python 5 2 NaN 2.0 10.0 2 c++
- sep:分隔符,例:sep="\s+",表示用任意大小空格作为分隔符
ps:常用正则表达式和限定匹配次数/边界
7.写的参数
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"]
(9)to_csv时还需设置sep参数
df = pd.read_excel(r"D:\data.xlsx",sheet_nam = 0,nrows = 5)
df.to_excel(r"C:\test.xlsx",index = False,columns = ["用户id","性别","消费金额","贷款与否"],
encoding = "utf-8",sheet_name = "示例",na_rep = "Na",inf_rep = "Na")
8.批量读取
import os
import pandas as pd
frame = []
path = r"C:\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:\example\order-14.3.csv
C:\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
ps:数据框连接:
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
objs 需要连接的对象,eg [df1, df2]
axis axis = 0, 表示在水平方向(row)进行连接 axis = 1, 表示在垂直方向(column)进行连接
join outer, 表示index全部需要; inner,表示只取index重合的部分
join_axes 传入需要保留的index
ignore_index 忽略需要连接的frame本身的index。当原本的index没有特别意义的时候可以使用
keys 可以给每个需要连接的df一个label
参考:正则表达式https://www.jiqizhixin.com/articles/2018-04-16-2;https://cloud.tencent.com/developer/article/1149679
pandas方法:https://blog.csdn.net/sinat_29957455/article/details/79054126;https://zhuanlan.zhihu.com/p/60248460
numpy模块文件存取为数组 :
- 读取np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)
• frame : 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
• dtype : 数据类型,可选
• delimiter : 分割字符串,默认是任何空格
• unpack : 如果True,读入属性将分别写入不同变量 - 保存np.savetxt(frame, array, fmt='%.18e', delimiter=None)
• frame : 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
• array : 存入文件的数组
• fmt : 写入文件的格式,例如:%d %.2f %.18e
• delimiter : 分割字符串,默认是任何空格