1.文件操作介绍
1.什么是文件
日常中的数据存储在纸上, 而计算机的数据存储在哪里呢? —硬盘上
2.文件的作用
一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,相比重启电脑之后,“哭都没地方哭了”。 默认数据是加载到内存中,结果也是保存到内存中, 程序执行结束,所有的数据释放。
3.文件的打开与关闭
宋丹丹拉高音调说:这个得分成三步,第一步打开冰箱;第二步,把大象塞进冰箱里;第三步,把冰箱关上。在操作文件的整体过程与将大象放入冰箱的过程是很相似的。
文件的打开
在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件。
open(文件名,访问模式) e.g. f = open(‘test.txt’, ‘w’)
如果文件不存在那么创建,如果存在那么就先清空,然后写入数据
文件有多种打开方式
要读取二进制文件,比如图片、视频等等,用’rb’, ‘wb’, 'ab’等模式打开文件即可。
file对象的属性
2.文件的读写
1.file对象的常用方法
在打开文件时有的打开模式会把指针直接指向末尾,此时要是再读取内容的话就什么都读不出来,因为指针已经再最后了,再往后读啥也没有。此时就需要seek方法来改变指针的位置了。
seek(offset, from)有2个参数:
offset:偏移量,offset为正就往右偏移,如果为负就往左偏移,但在python2中可以为负,python3中就不行了
from:方向 0:表示文件开头; 1:表示当前位置; 2:表示文件末尾
例:把位置设置为:从文件开头,偏移5个字节
seek(5,0)
2.文件的关闭
方法一: 调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,
并且操作系统同一时间能打开的文件数量也是有限的
方法二: Python引入了with语句来自动帮我们调用close()方法
python中的with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会自动执行规定
的(“清理”)操作,释放被访问的资源,比如有文件读写后自动关闭、线程中锁的自动获取和释放等。
3.文件的拷贝
文件拷贝的原理就是打开这个文件,然后读出里面二点内容,再把这个内容写入另一个文件中
代码:
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-备份')
3.os模块详解
os,语义为操作系统,处理操作系统相关的功能,可跨平台。 比如显示当前目录下所有文件/删除某个文件/获取文件大小……
关于操作系统
文件与目录操作
os模块中的rename()可以完成对文件的重命名操作。
rename(需要修改的文件名, 新的文件名)
os模块中的remove()可以完成对文件的删除操作
remove(待删除的文件名)
可以根据以上内容写个练习题:(代码会在练习里写)
1. 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(X4G5.png)
2. 将当前img目录所有以.png结尾的后缀名改为.jpg.
4.json模块详解
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。
这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
1.python类型数据和JSON数据格式互相转换规则
python 中str类型到JSON中转为unicode类型,None转为null,dict对应object;
pyhton中的集合不能转成json格式。
2.数据类型编码/解码
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: 字典排序
如果我们碰到集合对象, datetime对象,或者自定义的类对象等json默认不支持的数据类型时,我们就需要自定义编解码函数。有两种方法来实现自定义编解码。
5.pickle模块详解
经常遇到在Python程序运行中得到了一些字符串、列表、字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据。
这个时候Pickle模块就派上用场了,它可以将对象转换为一种可以传输或存储的格式。
python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
python的pickle模块实现了python的所有数据序列和反序列化。与JSON不同的是pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型。
cPickle是pickle模块的C语言编译版本相对速度更快。在pythin3中pickle模块默认为从cPickle
JSON和pickle模块的区别
1、JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。
2、JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。
练习
批量修改文件名
代码:
import os
批量在文件名前加前缀
funFlag = 1 # 1表示添加标志, 2表示删除标志
folderName = './renameDir/'
获取指定路径的所有文件名字
dirList = os.listdir(folderName)
遍历输出所有文件名字
for name in dirList:
if funFlag == 1:
newName = '[西部开源]-' + name
elif funFlag == 2:
num = len('[西部开源]-')
newName = name[num:]
print("重命名 【%s】为【%s】成功! " %(name, newName))
os.rename(folderName+name, folderName+newName)
无重复字符的最长子串
滑动窗口方法:
维护一个滑动窗口,窗口内的都是没有重复的字符,去尽可能的扩大窗口的大小,窗口不停的向右滑动。
1)如果当前遍历到的字符从未出现过,那么直接扩大右边界;
2)如果当前遍历到的字符出现过,则缩小窗口(左边索引向右移动),然后继续观察当前遍历到的字符;
3)重复(1)(2),直到左边索引无法再移动;
4)维护一个结果res,每次用出现过的窗口大小来更新结果res,最后返回res获取结果。
代码:
#class Solution:
def lengthOfLongestSubstring(s:str):#(self, s: str) -> int:
# dt: 记录结果的字典dt={'字符': 索引位置}
# maxlen: 最长无重复子串个数;
# start: 索引开始的位置;
dt, maxlen, start = {}, 0, 0
# 依次遍历字符串的每个元素, 需要索引值(使用枚举)
for index, item in enumerate(s):
# 如果当前遍历到的字符出现过,则缩小窗口(左边索引向右移动),然后继续观察当前遍历到的字符;
if item in dt:
start = max(start, dt[item] + 1)
# 如果当前遍历到的字符从未出现过,那么直接扩大右边界;
maxlen = max(maxlen, index - start + 1)
dt[item] = index
print(maxlen)
return maxlen
s = input('请输入字符串:')
lengthOfLongestSubstring(s)
运行截图:
矩阵置零
代码:
def setZeroes( matrix):
R, C = len(matrix), len(matrix[0]) # number of rows, columns
where_is_zero = [[i,j] for i in range(R) for j in range(C) if matrix[i][j] == 0] # find where zeroes are
for zero in where_is_zero:
i, j = zero[0], zero[1]
matrix[i] = [0 for _ in range(C)] # set rows to 0
for k in range(R):
matrix[k][j] = 0 # set columns to 0
print(matrix)
li = [
[1,1,1],
[1,0,1],
[1,1,1]
]
setZeroes(li)
运行截图:
读取一个文件,显示除了以井号(#)开头的行以外的所有行。
代码:
import os
f = open('hello.txt','r')
while True:
# 每次只读取一行内容, 如果不能读取到内容, break跳出;
content = f.readline()
if not content:
break
else:
if content[0]!='#':
print(content, end='')
else:
continue
f.close()
文件内容:
运行截图:
作一个"密码薄",其可以存储一个网址(例www.csdn.net),
和一个密码(例如 123456),请编写程序完成这个“密码薄”的增删改查功能,并且实现文件存储功能。
import os
import json
dbdict = { }
def main_menu():
print('密码簿'.center)
print('''
1.查看完整密码簿
2.增加新的密码簿
3.修改指定密码簿
4.删除指定密码簿
0.退出
''')
global i
i = int(input('请输入您想进行的操作:'))
def view_data():
global dbdict
with open('test.txt', 'r') as f:
print(f.read())
def add_data():
global dbdict
with open('test.txt', 'w+') as f:
Network = input('请输入您想要添加的网站:')
if Network not in dbdict.keys():
Passwd = input('请输入网站的密码:')
dbdict[Network] = Passwd
dbdictStr = json.dumps(dbdict)
f.write(dbdictStr)
else:
print('该网址已存在!')
def remake_data():
global dbdict
with open('test.txt', 'w+') as f:
Network = input('请输入您想要修改的网站:')
if Network in dbdict.keys():
Passwd = input('请输入网站修改后的密码:')
dbdict[Network] = Passwd
dbdictStr = json.dumps(dbdict)
f.write(dbdictStr)
else:
print('该网址不存在!')
def del_data():
global dbdict
with open('test.txt', 'w+') as f:
Network = input('请输入您想要删除的网站:')
if Network in dbdict.keys():
del dbdict[Network]
dbdictStr = json.dumps(dbdict)
f.write(dbdictStr)
else:
print('该网址不存在!')
def main():
while True:
main_menu()
if i == 1:
view_data()
elif i == 2:
add_data()
elif i == 3:
remake_data()
elif i == 4:
del_data()
elif i == 0:
break
else:
print('请输入正确的操作符')
main()