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

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数据库查询语句
  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码使用了Pythonpickle模块来读取名为'data.pickle'的文件。通过使用with语句,可以确保在读取完文件后自动关闭文件。\[1\]在这个例子中,文件被打开并命名为f,然后使用pickle.load(f)来加载文件中的数据。加载的数据可以在后续的代码中使用。最后,使用f.close()来关闭文件。\[1\] 如果'data.pickle'文件中包含多个模型,可以使用while循环和异常处理来逐个加载模型。\[2\]在这个例子中,使用with语句打开文件,并在while循环中使用pickle.load(f)来加载模型。如果遇到EOFError异常,表示已经加载完所有模型,此时可以跳出循环。这样可以逐个加载并打印出所有模型。 另外,如果你想加载一个pickle文件并打印出其中的内容,可以使用以下代码:\[3\] ```python import pickle with open('data.pickle', 'rb') as f: load_file = pickle.load(f) print(load_file) ``` 这段代码打开名为'data.pickle'的文件,并使用pickle.load(f)加载文件中的数据。然后,将加载的数据打印出来。 希望这些信息对你有帮助! #### 引用[.reference_title] - *1* *2* [Python 读写文件操作: with open() as f,picklepmml数据库](https://blog.csdn.net/weixin_44290661/article/details/103028446)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [_pickle.UnpicklingError: pickle data was truncated](https://blog.csdn.net/qq_40282689/article/details/106591026)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值