2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Python 读写文件操作: with open() as f pickle pmml 数据库

Python 读写文件操作: with open() as f pickle pmml 数据库

时间:2018-07-11 20:59:53

相关推荐

Python 读写文件操作: with open() as f pickle pmml 数据库

文章目录

with open() as f 的用法写入csvtxtjsonpicklepmmlPickle 转 pmml方法xgboost模型转换连接MySQL数据库,读入pandas框架连接MongoDB数据库,读入pandas框架

with open() as f 的用法

参考:with open() as f的用法

直接写入保存,速度快。

写入csv

先上案例,写入一个csv(和写入txt类似):

write_head = Truewith open("a.csv", "w") as f: # 文件的写操作if write_head: # 先写表头s = ''for k in to_write: # to_write是一个字典s += k + ',' # csv的分隔符s = s[:-1]f.write(s+'\n') # 写入,换行write_head = Falses = ''for k in to_write:s += str(to_write[k])+','s = s[:-1]f.write(s+'\n')f.close() # 关闭文件

txt

文件的写操作:

with open('data.txt', 'w') as f:f.write('hello world') #文件的写操作

文件的读操作:

with open(r'filename.txt') as f:data_user = pd.read_csv(f) #文件的读操作

相关参数:

r: 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式

rb: 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。

r+: 打开一个文件用于读写。文件指针将会放在文件的开头。

rb+:以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。

w:打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

wb: 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

w+: 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

wb+:以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

a:打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

ab: 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

a+: 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

file对象的属性:

file.read([size]) 将文件数据作为字符串返回,可选参数size控制读取的字节数

file.readlines([size]) 返回文件中行内容的列表,size参数可选

file.write(str) 将字符串写入文件

file.writelines(strings) 将字符串序列写入文件

file.close() 关闭文件

file.closed 表示文件已经被关闭,否则为False

file.mode Access文件打开时使用的访问模式

file.encoding 文件所使用的编码

file.name 文件名

file.newlines 未读取到行分隔符时为None,只有一种行分隔符时为一个字符串,当文件有多种类型的行结束符时,则为一个包含所有当前所遇到的行结束的列表

file.softspace 为0表示在输出一数据后,要加上一个空格符,1表示不加。这个属性一般程序员用不着,由程序内部使用

json

JSON数据可以类比于Python里面的字典dict,因此使用时首先需要把JSON字符串转换为dict类型,可以使用:

(1) json.loads,该方法传入的是字符串,例如json_input = '{"name":"wenwen","age":"26","sex":"male"}';dict_obj = json.loads(json_input)

(2)json.load, 该方法传入的是文件对象,例如下例:

# 读入jsonimport jsonwith open('food.json', 'r') as f: data = json.load(f)# json转化为表格keys = ['id','description','group'] keys_df = pd.DataFrame(data, columns=keys)# json中的json转化为表格nutrients = []for i in data:temp = pd.DataFrame(i['nutrients']) temp['id'] = i['id']nutrients.append(temp)nutrients = pd.concat(nutrients, ignore_index=True)

python 字典转换为json串,使用dumps方法。

dict_input = {"name":"wenwen","age":"26","sex":"male"}json_str = json.dumps(dict_input)

如果是写入文件,使用dump方法:

dict_obj = {"name":"wenwen","age":"26","sex":"male"}f = open("data/json_file2.txt",'w')json.dump(dict_obj,f)

pickle

参考:【python】pandas库pd.read_pickle操作读取pickle数据与.to_pickle()永久储存数据

(1)pandas库to_pickle,pd.read_pickle

使用DataFrame的to_pickle属性就可以生成pickle文件对数据进行永久储存

import pandas as pdimport numpy as npdf = pd.DataFrame(np.arange(20).reshape(4,5))#使用DataFrame的to_pickle属性就可以生成pickle文件对数据进行永久储存df.to_pickle('foo.pkl')

pd.to_pickle,例如:

pd.to_pickle(dataframe, "df.pkl")

使用pandas库的pd.read_pickle读取pickle数据

pd.read_pickle('foo.pkl')

(2) pickle库

存储数据使用pickle.dump(obj, file, [,protocol]),将对象obj保存到文件file中去。使用pickle.load(file)从file中读取一个字符串,并将它重构为原来的python对象,反序列化出对象过程。

pickle.dump(obj, file, [,protocol])

import picklef = open('data_one.pkl','wb') # 写入一个文件,用写入二进制的格式datas = {'name':'Bruce','age':25,'high':175} # 待写入数据data_one = pickle.dump(datas,f,-1) #dump函数将obj数据datas导入到file文件f中f.close() #完整的f文件操作结束

pickle.dump() 与pickle.dumps() 保存对象区别

#保存对象pickle.dump(object,file):打开一个文件file作为pickle对象,并且将一个对象object写入。String=pickle.dumps(object):将对象序列化后的pickle对象作为字符串返回。

pickle.load(file)

f = open('data_one.pkl','rb') #打开一个data_one文件pickle.load(f) #使用load的方法将数据从pkl文件中读取出来f.close()#打开文件使用pickle.load后,生成的文件后续可以一直调用In [13]: f = open('data_one.pkl','rb')In [14]: c = pickle.load(f) # 基石close,c也可以一直调用In [15]: f.close()

pickle.load() 与pickle.loads() 调用对象区别:

#调用对象Object=pickle.load(file):打开一个文件file作为pickle,并且将一个对象object读出。Object=pickle.loads(string):从一个字符串而不是文件中还原一个对象。

pickle案例代码

训练模型的保存和调用:

1 通过Pickle(python内置的库)保存、调用

2 通过joblib(外部库)保存、调用

# save model to filepickle.dump(model, open(“model_t.pickle", "wb"))# 加载模型文件loaded_model = pickle.load(open(" model_t.pickle ", "rb"))# 查看模型包含哪些变量Print(dir(loaded_model)# 对测试数据进行预测y_pred = loaded_model.predict(X_test)# 训练 XGBoost 模型, 通过joblib库保存模型, 加载模型进行预测from sklearn.externals import joblib # save model to filejoblib.dump(model, open(“model_t.pickle", "wb"))# 加载模型文件loaded_model = joblib.load(open(" model_t.pickle ", "rb"))# 对测试数据进行预测y_pred = loaded_model.predict(X_test)

当一个pickle文件不止一个模型时,可以通过while循环load的方式解决,直到抛出异常为止。

with open('model_t.pickle', 'rb') as f:while True:try:model = pickle.load(f)print(model)except EOFError:break

pmml

参考:windows下将python模型保存为PMML文件

predict model markup language 预测模型标记语言,它以xml格式保存,可跨平台调用。例如离线训练了一个模型,让java,c#,c/c++等语言写的系统调用,所以需要存为pmml,满足跨平台调用要求。

from sklearn.cluster import KMeansfrom sklearn.externals import joblibfrom sklearn import clusterimport numpy as npdata = np.random.rand(10,3)estimator=KMeans(n_clusters=2,init='k-means++',n_jobs=1)from sklearn2pmml import PMMLPipeline, sklearn2pmml # 调用pmml包km_pipeline = PMMLPipeline([("KM", estimator)]) # 创建模型管道km_pipeline.fit(data) # 训练模型sklearn2pmml(km_pipeline, "KM.pmml") # 导出为KM.pmml

将PMML文件部署在Java环境(未验证,仅供参考)

import org.dmg.pmml.FieldName;import org.dmg.pmml.PMML;import org.jpmml.evaluator.*;import org.xml.sax.SAXException;import javax.xml.bind.JAXBException;import java.io.*;import java.util.*;public class PmmlForJavaExample1 {public static void main(String[] args) {// 读取PMML文件Evaluator evaluator = null;File file = new File("//home//scripts//linearregression.pmml");try (InputStream is = new FileInputStream(file)) {PMML pmml = org.jpmml.model.PMMLUtil.unmarshal(is);evaluator = ModelEvaluatorFactory.newInstance().newModelEvaluator(pmml);System.out.println("success");} catch (IOException | JAXBException | SAXException e) {e.printStackTrace();System.out.println("error");}

Pickle 转 pmml方法

xgboost模型转换

xgboost模型,如果是基于原生xgboost.core库生成的,不能使用sklearn2pmml转为pmml文件,应使用以下方法:

下载jpmml-xgboost,github地址如下:

/jpmml/jpmml-xgboost.git

下载完成后,进入jpmml-xgboost的项目文件夹,编译代码:

mvn clean install

准备.model和fmap文件,生成这两个文件的python脚本如下。

然后,将.model文件和fmap文件放到jpmml-xgboost项目的/target文件夹下。也可以在python脚本中就把save_path指定为jpmml-xgboost项目的/target文件夹。

import picklefrom pathlib import Path# pickle文件所在文件夹绝对路径download_path = Path("/home/Documents/test_score")# model文件和fmap保存路径save_path = Path("/home/gitlab/pickle/jpmml-xgboost/target")# pickle文件名pickle_file = download_path / "model_home.pickle"# model文件名model_file = save_path / "xgb.model"# fmap文件名map_file = save_path / "fmap"with open(pickle_file, 'rb') as f:p_model = pickle.load(f)p_model.save_model(str(model_file))def build_fmap(names, file):with open(file, "w") as f2:for i, feat in enumerate(names):f2.write("{0}\t{1}\tq\n".format(i, feat))feature_names = p_model.feature_namesbuild_fmap(feature_names, map_file)

进入jpmml-xgboost项目的/target文件夹,使用如下命令生成pmml文件java -jar jpmml-xgboost-executable-1.3-SNAPSHOT.jar --model-input xgb.model --fmap-input fmap --target-name prob --pmml-output xgboost.pmml

如果xgboost模型使用了early_stopping(提前停止学习)策略,在预测p值时不一定会使用模型中的所有cart树。所以需要查看模型中用了多少cart树,代码为:

import picklefrom pathlib import Path# pickle文件所在文件夹绝对路径download_path = Path("/home/Documents/test_score")# pickle文件名pickle_file = download_path / "model_home.pickle"with open(pickle_file, 'rb') as f:p_model = pickle.load(f)print(p_model.best_ntree_limit)

在本例中可看到输出结果为118,即模型使用前118颗cart树来预测p值,效果最好。

然后进入jpmml-xgboost项目的/target文件夹,在原生成pmml文件指令的基础上添加 --ntree-limit 118,即:java -jar jpmml-xgboost-executable-1.3-SNAPSHOT.jar --model-input xgb.model --fmap-input fmap --target-name prob --pmml-output xgboost.pmml --ntree-limit 118

连接MySQL数据库,读入pandas框架

参考:翟锟 胡锋 周晓然 《Python机器学习——数据分析与评分卡建模》

import pandas as pdimport pymysql # 数据库python包conn = pymysql.connect(host = '主机IP',user = '用户名',password = '密码',db = '数据库名',port = 端口,charset = 'utf8')table="SELECT * FROM 表1" # 连接到mysql后查询到的表data = pd.read_sql(table,conn) # 读取到pandas框架

连接MongoDB数据库,读入pandas框架

参考:翟锟 胡锋 周晓然 《Python机器学习——数据分析与评分卡建模》

import pandas as pdfrom pymongo import MongoClient # 数据库python包client = MongoClient('主机IP', port=端口) db=client.数据库名db.authenticate("用户名", "密码") table=db.表名 # 连接到MongoDB后查询到的表data = pd.DataFrame(list(table.find())) # 读入pandas框架,其中find括号里可以加入MongoDB数据库查询语句

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。