一.文件的操作介绍
(1)文件的打开与关闭
打开:用open函数打开一个已经存在文件或者创建一个新文件。
eg . f = open("python.txt ",‘w’)
文件的打开方式:
(ps . 要读取二进制文件,比如图片,视频等时,用‘rb’ , ‘wb’ 'ab’等模式打开)
r :
*1. 读权限:yes
*2 . 写权限 no
*3 . 文件不存在,是否创建文件: no
*4 . 文件操作时是否清空内容: no
w :
*1 . 读权限: no
*2 . 写权限: yes
*3 . 文件不存在时,是否会创建: yes
*4 . 文件操作时,是否会清空: yes
a :
*1 . 读权限: no
*2 . 写权限: yes
*3 . 文件不存在时,是否会创建: yes
*4 . 文件操作时,是否会清空: no
w+ :
*1 . 读权限: yes
*2 . 写权限: yes
*3 . 文件不存在时,是否会创建: yes
*4 . 文件操作时,是否会清空 : yes
a+ :
*1 . 读权限: yes
*2 . 写权限: yes
*3 . 文件不存在时,是否会创建: yes
*4 . 文件操作时,是否会清空: no
r+ :
*1 . 读权限: yes
*2 . 写权限: yes
*3 . 文件不存在时,是否会创建: no
*4 . 文件操作时,是否会清空: no
eg .
实验结果如下:
对文件file 对象:
1)file.closed 如果文件关闭了,返回true,否则,返回False
2)file.mode 返回打开文件的访问模式。
3)file.name 返回文件的名称。
4)file.softspace 如果用print 输出,后面必须跟一个空格符,则返回False ,否则返回False .
file对象常用的方法:
1)读
read :读取指定字节,默认1024
readline : 读取文件中一行的内容
readlines:读取文件的所有内容,返回一个列表。
2)写
write:从指针所在的位置写入,写入的是字符串内容。
writeliines:将列表中的每个元素都写入文件中。
3)定位
tell() 指针当前所在的位置
seek() 移动指针的位置
seek(ofset,from)—offset :偏移量,
from:0:表示文件开头,1:表示当前位置,2:表示文件末尾。
(2)文件的关闭
方法一:调用close() 方法关闭文件,文件使用后需要关闭,因为文件对象会占用操作及系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。
方法二:python中引入了with语句来自动帮我们调用close() 方法
with open("/doc/file’/‘r’) as f:
print(f.read())
(python中with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会自动执行规定的“清理”操作,释放被访问的资源,比如有文件读写后自动关闭,线程中锁的自动获取和释放。)
eg .
实验结果如下:
(3)文件的备份
eg.将一个文件中的内容,拷贝到别的文件中。
代码如下:
import os
def copy(sorce_file, copy_file):
"""
思路:以读的方式打开源文件,然后复制下来,之后一些的方式写进需要拷贝的文件中。完成拷贝工作。
:param sorce_file: 源文件
:param copy_file: 拷贝到的文件
:return:
"""
if os.path.exists(sorce_file):
f = open(sorce_file)
content = f.read()
f.close()
copy_f = open(copy_file, 'w')
copy_f.write(content)
copy_f.close()
print("拷贝%s为%s成功" %(sorce_file, copy_file))
else:
print("拷贝%s不存在" %(sorce_file))
copy('doc/root', 'doc/passwd')
二. os模块
定义:语义为操作系统,处理操作系统相关功能,可跨平台。比如显示当前目录下所有文件或者删除某个文件或者获取文件大小。
eg. os a模块获取信息方法:
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'])
路径:绝对路径和相对路径。
(1)os模块中的rename()可以完成对文件的重命名操作。
rename(需要修改的文件名,新的文件名)
(2)os模块中的remove()可以完成对文件的是删除操作 。
remove(待删除的文件名)
(3)os 模块中创建删除目录:
创建目录:os.mkdir() 。eg. os.mkdir(‘img’)
递归创建目录: mkdir -p
删除目录: os.rmdir(‘iimg’)
(4)os 模块创建删除文件
创建文件:os.mknod() 。 eg.os.mknod(‘root.txt’)
eg.文件批量创建。
import os
import random
import string
def generate_code(length=4):
code_li = random.sample(string.ascii_lowercase, 1 + string.ascii_uppercase, 2 + string.digits, 1)
# 将密码的组合顺序打乱
random.shuffle(code_li)
#将列表生成为字符串
return "".join(code_li)
def create_file():
dirname = 'img'
if not os.path.exists(dirname):
os.mkdir(dirname)
print("目录%s创建成功" % (dirname))
for count in range(10):
filename = generate_code() + '.png'
fullfile_name = os.path.join(dirname, filename)
os.mknod(fullfile_name)
print("%s创建成功" % (fullfile_name))
create_file()
批量修改后缀名:
import os
def add_ad(suffix):
def modify_suffix(dirname, old_suffix, new_suffix):
"""
'hello.png' ----'hello.jpg'
img .png .jpg
:param dirname: 操作的目录
:param old_suffix: 原先的后缀名
:param new_suffix: 新的后缀名
:return:
"""
# 0-1).判断源后缀名是否以点开头, 如果不是,则添加;
if not old_suffix.startswith('.'):
old_suffix = '.' + old_suffix
# 0-2). 判断新的后缀名是否以点开头, 如果不是,则添加;
if not new_suffix.startswith('.'):
new_suffix = '.' + new_suffix
# 1. 判断查找的目录是否存在, 如果不存在, 显示报错
if not os.path.exists(dirname):
print("Error: 目录%s不存在" % (dirname))
# 2. 如果文件存在,做如下操作:
else:
# 2-1). 列出指定目录的所有文件名;
filenames = os.listdir(dirname)
# 2-2). 依次遍历目录的每一个文件;
for filename in filenames:
# 2-3). 如果文件是以old_suffix结尾,则对改文件重命名;
if filename.endswith(old_suffix):
# 修改后缀名
# 2-3-1). 将后缀名和文件名本身分隔开; hello.png === hello .png, 并生成新的文件名
new_filename = os.path.splitext(filename)[0] + new_suffix
full_old_filename = os.path.join(dirname, filename)
full_new_filename = os.path.join(dirname, new_filename)
# 2-3-2). 重命名
os.rename(full_old_filename, full_new_filename)
print("重命名【%s】 为【%s】成功!" % (filename, new_filename))
modify_suffix('img', '.jpg', '.png')
JSON模块:
定义: JSON是一种轻量级的数据交换格式。它是基于ECMAScript的一个子集。它是将各种语言进行相互转换(字典,元组,数值都可以,集合不行)
优势:易于人阅读和编写,同时也可以提高机器的解析和生成,(一般用于提升网络传输速率。)
eg
ps : 通用模块:
(1)ASCII :只能存储英文
(2)GB2312:不通用
(3)unicode:每个字都用两个字节存放,文件较大。
(4)utf-8:英文用一个字节存放,中文用三个字节存储JSON模块存储,保存的是字符串
JSON模块应用:将json转换成python模块。
代码如下:
运行结果如下:
将python 模块转换成json模块
代码如下:
运行结果如下:
数据类型编解码:
(1)json.dumps :将python对象编码成json字符串。
(ps.序列化及反序列化常用的参数:
ensure_ascii=False :中文存储时需要设定
indent =4 增加缩进,增强可读性,但缩进空格会使数据变大
separators=(’,’,’;’) 自定义分隔符,元素分隔符为逗号,字典key和value值的分隔符为冒号。
sort_key =True :字典排序)
(2)json.dump: 将对象序列化并保存在文件中。
(3)json.loads:将已编码的JSON字符串解码成python对象。
(4)json.load: 将序列化字符串从文件中读取并反序列化。
运行结果为:
pickle模块:
python中的pickle 模块实现python的所有数据序列和反序列化。与JSON不同的是pickle不是用于语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法。它支持python中所有的数据类型。
运行结果为:
总结:
1.JSON只能处理基本的数据类型,pickle能处理所有的python数据类型。
2.JSON用于各种语言之间的字符转换,pickle用于Python程序对象的持久化或者python程序间对象网络传输,但不同版本的python序列化可能存在差异。
实例一:读取一个文件,显示除了以#开头的行以外的所有行。
实验代码如下:
运行结果为:
实例二:制作一个密码薄,其可以存储一个网址(eg:www.csdn.net)和一个密码(eg.1234)请编写程序完成增删改查功能,并实现文件存储功能。
import os
def start(): # 定义主界面函数
print("请选择需要的操作:")
print("1.增加网址和密码")
print("2.删除网址和密码")
print("3.修改网址和密码")
def add_weblist():
#定义添加网址的函数:
f = open("weblist.txt", 'w')
web = input("请输入需要添加的网址:") + '\n'
password = input("请输入密码:")
f.write(web)
f.write(password)
f.close()
def del_weblist():
#删除网址的函数:
weblist = ""
f = open("weblist.txt", 'r')
web = input("请输入需要删除的网址:")
password = input("请输入密码:")
fr = f.read()
f.close()
if web in fr and password in fr:
f1 = open("weblist.txt", 'w')
f1.write(web)
f1.close()
print("删除成功")
else:
print("未找到对应网址或密码,请检查后重试")
def change_weblist():
#改变网址的函数:
f = open("weblist.txt", 'r')
web = input("请输入旧网址:")
password = input("请输入旧密码:")
fr = f.read()
f.close()
if web in fr and password in fr:
f1 = open("weblist.txt", 'w')
new_web = input("请输入新网址:") + '\n'
new_password = input("请输入新密码:")
f1.write(new_web)
f1.write(new_password)
f.close()
print("更改成功")
else:
print("未找到对应网址或密码,请检查后重试")
#启动start()函数:
start()
while True:
num = input("请输入操作指令:\n")
num = int(num)
if num == 1:
add_weblist()
elif num == 2:
del_weblist()
elif num == 3:
change_weblist()
实例三:设置无重复字符的最长字符串。