文件
文件是什么?
计算机文件属于文件的一种,与普通文件载体不同,计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。文件可以是文本文档、图片、程序等等。文件通常具有三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以 JPEG 格式保存并且文件扩展名为 .jpg)。
1.文件的操作
在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件。
open(文件名,访问模式) e.g. f = open('test.txt', 'w') 如果文件不存在那么创建,如果存在那么就先清空,然后写入数据。
在对文件进行操作之后一定要记得加 .close 把打开的文件关闭,否则相关数据结构会占用内存。
下表是对访问模式的一个简单总结:
访问模式 |
有无读权限 |
有无写权限 | 文件不存在,是否会创建文件 |
是否会清空文件 |
r | 有 | 无 | 否 | 否 |
w | 无 | 有 | 是 | 是 |
a | 无 | 有 | 是 | 否 |
r+ | 有 | 有 | 否 | 否 |
w+ | 有 | 有 | 是 | 是 |
a+ | 有 | 有 | 是 | 否 |
下面这个图会更清晰明了:
在这里要注意指针的位置,因为指针位置会对文件后续的操作有很大的影响。
以上访问模式适用于普通文本文件,要读取二进制文件时,比如图片、视频等等,用'rb', 'wb', 'ab'等模式打开文件即可。
下面看几个常用的文件对象的属性:
对文件的操作的一个简单案例就是实现拷贝文件,拷贝文件的思路如下:
- 判断拷贝的文件是否存在?
- 如果存在, 将源文件的内容读出来, 写入目标文件中。
具体操作如下:
import os
def copy(source_file, dst_file):
"""
实现拷贝文件的操作
思路:
cp /etc/passwd /etc/hello
1. 判断拷贝的文件是否存在
2. 如果存在, 将源文件的内容读出来, 写入目标文件
"""
if os.path.exists(source_file):
# 将源文件的内容读出来
f = open(source_file)
content = f.read()
f.close()
# 写入目标文件
dst_f = open(dst_file, 'w')
dst_f.write(content)
dst_f.close()
print("拷贝%s为%s成功" %(source_file, dst_file))
else:
print("源文件%s不存在" %(source_file))
copy('/etc/passwd', 'doc/passwd-备份')
2.文件的读写操作
文件对象的几个常用方法如下:
接下来分别对它们进行说明:
1)移动指针的位置(定位)
seek(offset, from)有2个参数:
offset:偏移量
from:方向 0:表示文件开头;1:表示当前位置;2:表示文件末尾
比如说: f.seek(0,2)表示从文件开头的位置向右移动两个字节。
还有一个 .tell ,它可以输出当前指针的位置。形式为:print(f.tell()),输出打印指针在第几个字节处。
2)读操作
通过 .read 实现对文件的读操作,会读取文件的全部内容。
但是如果当文件的很大时,一次性读取它的全部内容,这显然是不妥的,所以这时要用到 .readline 去读取文件。
.readline 可以每次读取文件一行的内容,这样就不会占用太大的内存,然后通过循环语句就可以一行一行的把文件读取出来了。
代码如下:
f = open(filename, 'r')
while True:
# 每次只读取一行内容, 如果不能读取到内容, break跳出;
content = f.readline()
if not content:
break
else:
print(content, end='')
还有 .readlines 也类似,它是每次读取文件的多行内容。
3)写操作
通过 .write 方式对文件进行写操作,它会把内容以字符串的方式写入文件中。
形式为:f.write("写入文件内容")
.writelines 可以将列表中的所有元素写入文件中去。
形式为:f.writelines(['第一个\n', '第二个\n'])
4)文件的关闭
关闭文件有两种方法:
方法一:调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源, 并且操作系统同一时间能打开的文件数量也是有限的。
方法二: Python引入了with语句来自动帮我们调用close()方法,形式如下:
with语句工作原理:
python中的with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会自动执行规定的(“清理”)操作,释放被访问的资源,比如有文件读写后自动关闭、线程中锁的自动获取和释放等。
3.OS模块详解
os,语义为操作系统,处理操作系统相关的功能,可跨平台。 比如显示当前目录下所有文件/删除某个文件/获取文件大小……
1)os模块系统信息获取
import os
# 1). 返回操作系统类型, 值为posix,是Linux操作系统, 值为nt, 是windows操作系统
print(os.name)
os_name = 'Linux' if os.name =='posix' else 'Windows'
print("当前操作系统: %s" %(os_name))
# 2). 操作系统的详细信息
detail_info = os.uname()
print(detail_info)
print("主机名:", detail_info.nodename)
print("硬件架构:", detail_info.machine)
print("系统名称:", detail_info.sysname)
print("Linux内核的版本号:", detail_info.release)
# 3). 系统环境变量等价于Linux的env命令
print(os.environ)
# 4). 通过key值获取环境变量对应的value值
print(os.environ['PATH'])
2)文件目录的操作
关于路径的:
关于文件目录的:
4.json和pickle模块详解
1)JSON模块
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。
这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
python类型数据和JSON数据格式互相转换规则如下:
有几点要重点注意:
python 中str类型到JSON中转为unicode类型,None转为null,dict对应object;
pyhton中的集合不能转成json格式。
JSON数据类型编解码:
还有两个:
.dump: 将对象序列化并保存到文件
.load: 将序列化字符串从文件读取并反序列化
下面看一下序列化及反序列化常用参数:
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
encoding="utf-8", default=None, sort_keys=False, **kw)
- ensure_ascii=False: 中文存储需要设定
- indent=4: 增加缩进,增强可读性,但缩进空格会使数据变大
- separators=(',',':'): 自定义分隔符,元素间分隔符为逗号, 字典key和value值的分隔符为冒号
- sort_keys=True: 字典排序
举例如下:
2)pickle模块
python的pickle模块实现了python的所有数据序列和反序列化。与JSON不同的是pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型。 cPickle是pickle模块的C语言编译版本相对速度更快。
pickle序列化(编码): python对象编码成pickle的bytes类型数据
pickle反序列化(解码): 将pickle的bytes类型数据转成python对象
JSON和pickle模块的区别:
- JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。
- JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。