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

您所在的位置:网站首页 python生成pmml文件 Python 读写文件操作: with open() as f,pickle,pmml,数据库

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

2024-01-26 23:31| 来源: 网络整理| 查看: 265

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

with open() as f 的用法

参考:with open() as f的用法 直接写入保存,速度快。

写入csv

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

write_head = True with 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 = False s = '' 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, 该方法传入的是文件对象,例如下例:

# 读入json import json with 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 pd import numpy as np df = 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 pickle f = 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 file pickle.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 file joblib.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 KMeans from sklearn.externals import joblib from sklearn import cluster import numpy as np data = 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地址如下: https://github.com/jpmml/jpmml-xgboost.git 下载完成后,进入jpmml-xgboost的项目文件夹,编译代码: mvn clean install 准备.model和fmap文件,生成这两个文件的python脚本如下。 然后,将.model文件和fmap文件放到jpmml-xgboost项目的/target文件夹下。也可以在python脚本中就把save_path指定为jpmml-xgboost项目的/target文件夹。

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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3