1、文件读写
f = open('day4','r+',encoding = 'utf-8')
#读模式 r 打开不存在的文件会报错、只能读、不能写
#写模式 w #1、打开不存在的文件,会新建一个文件,会清空原有文件
#2、不能读、只能写
#追加模式 a #1、打开不存在的文件,会新建
#2、不能读、只能写
#读写模式 r+ 1、能读也能写
2、打开不存在文件的时候会报错
#写读模式 w+
1、能读
2、读不到内容,因为w先把文件内容清空
#追加读模式 a+
1、能读
2、能不能读到内容,读不到内容,因为上来指针就在最后,必须要有seek才能读到内容
f.seek(0)
1)文件直接循环
你直接循环文件对象,每次取的就是文件里面的每一行
for line in f:
print(line)
2)移动指针:
f.seek(0) # 移动文件指针到最前面
f.flush() # 刷新缓冲区,立即写到磁盘上。
# 计算机处理时,磁盘上的东西先读取到内存上,CPU再去读内存。读后再传入内存,再存到磁盘。
# 而定义变量是存在内存里。
# 内存和磁盘交换频繁会影响性能,所以有缓冲区,满了再写到磁盘里。
3)读取行:
print(f.readline())
读取一行的内容,
print(f.readlines())
读取所有内容,取每行元素组成的list
print(f.read())
读取所有内容
这三个会彼此影响,因为依次读,文件指针(写字符,光标)会移动。
4)删除更改文件名字:
import os
os.remove('stu.txt')#把user文件删掉
os.rename('.stu.txt','stu.txt') #更改文件名
5)记录指针位置:
f = open('access.log',encoding='utf-8')
point = f.tell() #记录指针的位置
f.seek(point) #指针回到记录的位置
2、集合、元组
1)集合: 用set,{}
s = set()
集合是无序的,自动去重的
# 集合天生可以去重
l = [1,2,2,5,5,3,5]
lset = set(l)
print(lset)
stus1 = {'胡绍燕','王义','王新','马春波','高文平'}
stus2 = {'胡绍燕','张芳芳','王新','马春波','高文平'}
#取交集(2种方法)
print(stus1.intersection(stus2))
print(stus1&stus2)
#取并集
print(stus1.union(stus2))
#print(stus1|stus2)
#差集
print(stus1-stus2)
print(stus1.difference(stus2))
#对称差集 只在一个集合里面出现过的
print(stus1.symmetric_difference(stus2))
print(stus1^stus2)
#增加元素
stus1.add('孙悟空')
#删除
stus1.pop()#随机删除一个
#stus1.remove('王新')
# 直接循环集合:取每一个元素
for s in stus1:
print(s)
2)元组: 用()元组也是一个list,但是它的值不能改变
# s = [1,2,3]
# t = (1,2,3) #元组。优先级高。
# m = (123)# 如果只一个元素,判断不出是否是元组。
# 如果一个元素的元组,元素后边要加,
# t[1]=4 #会报错。元组也无序,不可以修改
# print(t)
#print((4+5)*4)
3)俩个模块:
import string
print(string.ascii_lowercase)#取所有小写字母
print(string.ascii_uppercase)#取所有大写字母
print(string.digits)#取1-9自然数
print(string.ascii_letters)#取所有小写字母和大写字母
print(string.punctuation)#取特殊符号
import random
print(random.randint(1,23))#取1-23间的一个随机整数
s = [1,2,3,4]
print(random.choice(s))#随机选择一个元素
print(random.sample(s,3))#随机选择3个元素,放到list里
print(random.shuffle(s))#只能传list,打乱s顺序。但打乱后没有返回list,而是None
print(random.uniform(1,13))#取范围内一个小数,保留了很多位小数
f = random.uniform(1,13)
print(round(f,3))#取3位小数
3、函数
实现某个功能的一些代码。
提高代码的复用性。
函数必须被调用才会执行。
函数里面定义的变量:局部变量,只要一出了函数都不能用了
#定义一个函数
def hello():#定义一个叫hello的函数
print('hello')
#函数必须被调用才会执行
#调用函数
hello()#函数名后边加括号,才调用了函数
#定义函数
def write_file(file_name,content):#入参。定义个函数,有俩个变量名.其中file_name和content叫形参,是俩个形式参数
print(file_name,content)
with open(file_name,'a+',encoding='utf-8') as f:
f.write(content)
#调用函数:
# write_file('b.txt','123')
# write_file('a.txt','123')
# write_file('c.txt','12d3')
括号中的这个叫实参,实际参数
def read_file(file_name):#下边缩进部分叫函数体
with open(file_name,'a+',encoding='utf-8') as f:
f.seek(0)#a+,要注意指针位置
content = f.read()
return content#不写的话会返回None
#函数里面定义的变量,都是局部变量。只要一出了函数,就不能用了。
#需要思考怎样、需要不需要入参,怎样写return
#个人思考:入参是条件,return是目标
print(read_file('stu.txt'))#调用函数
return和print的区别:
return能返回一个值,而且能在调用的时候定义一个变量来接收。
print只是打印,只能看。
4.判断
非空即真,非0即真(不是真就是假,空就是假)(能省很多代码)
True
False '' None [] {}
username = input('username:').strip()
if username:#if是真了才走,空是假的,所以空的时候不走。
print('username不为空')
else:
print('username为空')
if 1:#1是true
print('true')
else:
print('false')
if 0:#0是false
print('true')
else:
print('false')
5.高效处理文件方法:
#将文件的行做成一个字典
f = open('user')#文件对象,或者文件句柄。
d = {}
while 1: #第一种,但要求文件里不能有空行
line = f.readline()#一行一行读,效率高
if line:#直接循环,取代read
user,passwd = line.split(',')
d[user]=passwd
else:#见空停止
break
print(d)
#取文件行内容
2.直接循环
for line in f:#直接循环文件对象,取的就是每一行
print('每次循环的是',line)
#增加行
f = open('user','a+')
#f.write()
l = ['abc123\n','bcd123\n']
s = 'adfsdfasf\n'
f.writelines(l)#高效方法,依循环依次将定义的list每一个元素写进去
如果是字符串儿的话,还是用write吧
更改文件:第一种
with open('user','a+') as f:#会自动判断,关闭文件
f.seek(0)
result = f.read()
new_result = result.replace('jjj','ABC')#替换了,但并不能更改到文件中
f.seek(0)
f.truncate()#清空文件内容
f.write(new_result)
#更改文件:第二种
import os
with open('user')as fr,open('.users','w')as fw:
for line in fr:#从需要修改的文件里面读
new_line = line.replace('abc','ABC')#需要更改的更改,不需要的不做更改,直接定义
fw.write(new_line)
os.remove('user')#把user文件删掉
os.rename('.users','user')#把users改名儿为user