一、引言

什么?有了第二篇文件操作还不够?远远不够!而且在读完第三篇文件操作还是不够。关于文件的操作,后续的学习中将不断学习新的操作方式,使用更加合适的方法。

进入正题,上一篇讲到,Python对文件最基本的读取写入操作,都必须是字符串,所有的数据必须要转化成字符串写入,都出来的也全部都是字符串,这会给我们实际应用中造成一些困扰,上一篇文章讲述了如何使用eval()函数,但是也有局限性,比如:字符串格式稍有错误(结尾带有换行符\n)就会转换出错;写入文件之前在内存中的int型数据,写入读取仔eval后无法变回int型等。因此,我们需要更加标准、更加合理的方法来完成文件读写。

接下来将一一介绍四个模块:json, pickle, shelve, shutil

先将个概念:序列化。即将内存中各种类型的数据转成能够写入文件的格式的标准过程。反序列化是序列化的反过程。

二、json模块

json模块提供一些功能,能够处理简单的数据类型:布尔型、(长)整形、字符型、浮点型等,以及列表、字典等。将这些类型的数据通过序列化即可写入文件,读取文件时通过反序列化即可在内存中正常使用。json是可以跨平台使用的,python、java等语言都可以使用它,并进行不同语言之间的数据交互。

1、dumps() 和 loads() 方法

 import json    # 导入json模块

 kwargs={
"name":"Alex",
"age":21,
}
args=[1,6,8,4]
acer="woshishei" f=open("序列化","w",encoding="utf-8")
f.write(json.dumps(kwargs)) # 将字典序列化写入文件
f.write("\n")
f.write(json.dumps(args)) # 将列表序列化写入文件
f.write("\n")
f.write(json.dumps(acer)) # 将字符串序列化写入文件
f.write("\n")
f.close()
print(type(json.dumps(args))) #输出序列化后的类型 f=open("序列化","r",encoding="utf-8")
data=f.readlines() #读取文件
f.close()
for i,j in enumerate(data):
data[i]=json.loads(j) # 逐个反序列化
print(data[0]) # 输出
print(data[1])
print(data[2])
print(data[0]["age"])
print(data[1][1])

运行结果:

运行结果显示: json序列化就是将其转化成字符串(标准、规范的操作)

2、dump() 和  load() 方法

上面了解到,序列化的语句是 json.dumps(<被转化变量>),反序列化语句是 json.loads(<从文件读出的数据>)

同时也应该注意到,我是一行一行写读的,一个数据写一行,一行绝对不能写两个数据。

dump() 和  load() 只是写法不同,功能是一样的

f=open("序列化","w",encoding="utf-8")
json.dump(kwargs,f)
f.close() f=open("序列化","r",encoding="utf-8")
data=json.load(f) #读取文件并将其反序列化
f.close()

有了json模块,可以很方便地在内存中复原数据。

三、pickle模块

pickle模块和json模块的功能基本相同。不同点是:pickle模块不能跨平台使用,是Python专用的模块,但是可以使用复杂的数据类型,函数等都可以。

1、dumps() 和 loads() 方法

import pickle

f=open("序列化","wb") #如果用pickle,必须用二进制文件的打开方式
f.write(pickle.dumps(kwargs)) #与json完全一样的操作
f.close()
print(type(pickle.dumps(kwargs))) #将数据类型转化成何种类型 f=open("序列化","rb")
data=pickle.loads(f.read()) # 反序列化
f.close()
print(data["age"])

运行结果:

结果显示,pickle序列化后,将数据转化成bytes类型。

2、dump() 和  load() 方法

def text(name):
print("hello,",name) kwargs={
"name":"Alex",
"age":21,
"function":text
} f=open("序列化","wb")
pickle.dump(kwargs,f)
f.close() f=open("序列化","rb")
data=pickle.load(f)
f.close()
data["function"]("alex")

结果:

运行结果证明,函数被序列化写入文件,并成功反序列化回来,运行无误。

对于反序列化来说,如果反序列化操作在另外一个程序,读取之前写入的函数时会报错。因为序列化的程序在结束时函数已经不存在。

如果想要在反序列化的程序里正常使用,只能从原来的文件里copy函数过来。

新建一个.py文件,测试一下:

f=open("序列化","rb")
data=pickle.load(f)
f.close()
data["function"]("alex")

程序报错!

在这里强调一点:json序列化写入文件的时候,可以将多个数据分行写入;但是pickle序列化则不可以,一个数据只能写入一个文件!

四、shelve模块

shelve模块是一个将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的Pyhton模块。可以理解是对pickle更高一层的封装,能够非常方便地写入和读取数据。

 import shelve
import datetime info={"age":22,"sex":"man"}
name=["hello","good","nice"] # 写入文件
d=shelve.open("shelve_text") # 打开一个文件
d["name"]=name # 持久化列表
d["info"]=info # 持久化字典
d["date"]=datetime.datetime.now() # 持久化时间
d.close() # 读取文件
d=shelve.open("shelve_text")
a=d.get("name")
b=d.get("info")
c=d.get("date")
d.close() print(a)
print(b)
print(c)

运行结果:

完美运行。可以看到,shelve模块读写文件的操作更加简洁方便。

五、shutil模块

更高级的操作来了——shutil模块。不过,它不止能对普通文件操作,还可以处理文件夹和压缩包。

1.普通文件、文件夹操作部分:

import shutil

f1=open("text1","r",encoding="utf-8")
f2=open("text2","w",encoding="utf-8")
shutil.copyfileobj(f1,f2) # 将文件内容拷贝到另一个文件中(必须先打开文件才能操作)
f1.close()
f2.close()

运行情况就不上图了,可以自己试一下。

还有丰富的操作手法:

 shutil.copyfile("text1","text3") # 不需要打开文件,直接复制文件(如果有文件直接覆盖,如果没有文件则创建)

 shutil.copymode("text1","text2") # 仅拷贝权限,内容、组、用户均不拷贝
shutil.copystat("text1","text2") # 拷贝状态的信息,不拷贝内容 shutil.copy("text1","text2") # 将文件和权限都复制过来(源代码中:copy == copyfile + copymode ) shutil.copy2("text1","text2") # 将文件和状态信息拷贝(源代码中:copy2 == copyfile + copystat ) shutil.copytree("package2","new_package2") # 递归地去拷贝文件(复制文件夹) shutil.rmtree("new_package2") # 删除一个文件夹 shutil.move("F:\\Pythonfiles\\day5\\package2","D:\\") # 移动文件(夹)的位置( 旧路径(完整)-->新路径(父目录) )
shutil.move("D:\\package2","F:\\Pythonfiles\\day5")

2.压缩包操作部分:

① shutil.make_archive() 方法:创建压缩包并返回路径,

参数:

base_name:压缩包名,也可以是压缩包路径。如果只是名称,默认当前路径
format:压缩包格式,"zip","tar","bztar","gztar"
root_dir:被压缩文件的路径,默认当前路径
owner:用户,默认当前用户
group:组,默认当前组
logger:用于记录日志,通常是logging.Logger对象

#res=shutil.make_archive("压缩包","zip","package2")  #如果多次执行此语句,将覆盖同名压缩包
#print("路径是:",res) #res1=shutil.make_archive("压缩包2","zip","packaged")
#print("路径2是",res1)

② shutil对压缩包的操作是通过 zipfile 和 tarfile 两个模块来完成的:

先说zipfile:

import zipfile

#压缩文件
z=zipfile.ZipFile("压缩包.zip","a") #打开压缩包
z.write("text1")
z.write("random_module.py")
z.write("asdf.xlsx")
z.write("135456.txt")
z.close() #关闭压缩包 '''
"w"方式打开并写入,会覆盖包内所有的文件
"a"方式可以追加文件,但需要注意的是,不能重复写入同名文件,否则会报错
''' #解压文件
z=zipfile.ZipFile("压缩包.zip","r")
#z.extractall() #将所有文件解压到当前路径下
z.extractall("wooo") #将所有文件解压到指定路径下
z.extract("asdf.xlsx","解压") #将指定文件解压(参数:member成员,path默认当前路径)
print(zipfile.ZipFile.namelist(z)) #输出文件列表
print(z.namelist()) #输出文件列表
z.close()
#在使用zipfile文件句柄z时,跟open打开文件不同,没有光标这种概念 print(zipfile.is_zipfile("压缩包.zip")) #判断文件是不是压缩文件

有兴趣可以在自己电脑上测试。

再讲tarfile:

import tarfile

# 压缩
tar = tarfile.open('your.tar','w')
print(help(tar.add))
tar.add('135456.txt',arcname="bbs2") # arcname="bbs2" 为存档的文件指定别名
tar.add('asdf.xlsx',arcname="cmdb")
tar.close() # 解压
tar = tarfile.open('your.tar','r')
tar.extractall("waaa") # 可设置解压地址
tar.close()

六、chardet模块

可以智能检测编码,第三方模块,需要安装。

在命令行直接输入 pip3 install chardet 即可安装

使用:

import chardet

f = open("文件","rb")
data = f.read()
f.close() res = chardet.detect(data)
printf(res)

结果:{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}

confidence翻译过来是自信程度,0.99,类似于机器学习

初学Python——文件操作第三篇的更多相关文章

  1. 初学Python——文件操作第二篇

    前言:为什么需要第二篇文件操作?因为第一篇的知识根本不足以支撑基本的需求.下面来一一分析. 一.Python文件操作的特点 首先来类比一下,作为高级编程语言的始祖,C语言如何对文件进行操作? 字符(串 ...

  2. 初学Python——文件操作

    一.文件的打开和关闭 1.常用的打开关闭语句 f=open("yesterday","r",encoding="utf-8") #打开文件 ...

  3. Python基础篇【第2篇】: Python文件操作

    Python文件操作 在Python中一个文件,就是一个操作对象,通过不同属性即可对文件进行各种操作.Python中提供了许多的内置函数和方法能够对文件进行基本操作. Python对文件的操作概括来说 ...

  4. 【转】C语言文件操作解析(三)

    原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...

  5. [Python学习笔记][第七章Python文件操作]

    2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...

  6. 关于python 文件操作os.fdopen(), os.close(), tempfile.mkstemp()

    嗯.最近在弄的东西也跟这个有关系,由于c基础渣渣.现在基本上都忘记得差不多的情况下,是需要花点功夫才能弄明白. 每个语言都有相关的文件操作. 今天在flask 的例子里看到这样一句话.拉开了文件操作折 ...

  7. Python之路Python文件操作

    Python之路Python文件操作 一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r&qu ...

  8. Python:文件操作技巧(File operation)(转)

    Python:文件操作技巧(File operation) 读写文件 # ! /usr/bin/python #  -*- coding: utf8 -*- spath = " D:/dow ...

  9. Python文件操作:文件的打开关闭读取写入

    Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...

随机推荐

  1. ionic APP二维码插件 地址

     二维码插件地址第一个   https://github.com/kyocn/BarcodeScanner git网址 下载网址  https://github.com/kyocn/BarcodeSc ...

  2. 朝花夕拾 - 应用了6年久经实际项目考验未变的代码 - singleton模式

    最近整理自正式工作(从有上社保开始算起)8年来的知识.发现技术演变过程如下: 开发工具和.Net Famework: Visual Studio 2002 ->2003 -> 2005 - ...

  3. spring一些简单小注意知识点

    Spring 配置详解 <!-- Bean元素:使用该元素描述需要spring容器管理的对象            class属性:被管理对象的完整类名.            name属性:给 ...

  4. Salesforce 自定义标签在代码中的应用

    自定义标签简介 Salesforce 中自定义标签(Custom Label)的作用是存储一般性的文本,可以用于 Apex.Visualforce 页面.Lightning 组件等地方,用于显示提示信 ...

  5. Linux网络设备驱动的实现

    结论: 1.对一个设备驱动而言,主要从两个方面进行着手,一个是控制流,一个是数据流. 控制流就是如何控制网络设备,数据流则说的是报文的收发流程. 2.网络设备可以是Linux服务器的网卡,也可以是嵌入 ...

  6. git 入门教程之github 教程

    github 教程 github 是一个基于 git 的代码托管平台,是平时工作学习的好帮手,学会如何用好 github 网站能够帮助我们更好分享代码或者与其他开发人员合作. 注册 github 账号 ...

  7. hadoop,spark,Zookeeper,,, 这些名字都是怎么来的呢?

    Apache 首先我们要明白,Apache 是一个 http 服务器,而我们熟悉的另一种说法"Apache Hadoop"中的 Apache 则指的是 Apache 软件基金会.& ...

  8. Mysql 查询昨天16:00至今天16:00之间的信息

    SELECT * FROM t_violation_info WHERE ( DATE(UPDATED_TIME) = CURDATE() AND HOUR (UPDATED_TIME) < 1 ...

  9. weblogic---- Remote远程调用

    删之前重新写一下以防以后遗忘 一.服务器端 package com.ij34.dao; import javax.ejb.Remote; /** * @author Admin * @date 创建时 ...

  10. ajax参数

    $.ajax({ type: "GET", url: "Login.ashx", dataType: "text", cache: fals ...