1 文件读写补充
文件修改
方法1:简单粗暴直接:
1、 先获取到文件里面的所有内容
2、 然后修改文件里面的内容
3、 清空原来文件里面的内容
4、 重新写入
f = open(‘test1.txt‘,‘r+‘)
f.seek(0)
all_data = f.read()
new_data = all_data.replace(‘123‘,‘python‘)
f.seek(0)
#将指针移到最前面
f.truncate() #清空原来文件内容
f.write(new_data) #重新写入文件内容
f.flush()
f.close()
方法2:高效的处理方式
1、 先打开原来的文件,再打开一个空文件
2、 循环处理原来文件里每一行数据,处理完之后写到新文件里
3、 将原来的文件删除,将新文件名字修改成原来文件的名字
import os
with open(‘words.txt‘) as fr,open(‘words1‘,‘w‘) as fw:
for line in fr:
line = line.lstrip() #去掉左边的空格
if line: #判断这一行是否有数据
line = line.replace(‘你‘,‘you‘) #替换数据
fw.write(line)
#写到新文件里面
os.remove(‘words.txt‘) #删除原来的文件
os.rename(‘words1‘,‘words.txt‘) #将新文件重命名为原来文件名
使用with open方法打开文件会自动关闭,不需要在手动去关闭这个文件;
f = open(‘笔记.txt‘) #打开的文件称为文件句柄或文件对象
for line in f: #直接循环文件对象,每次循环的时候就是去的每一行数据
print(‘line‘,line)
2
集合、json模块
集合作用:
1、 天生去重
2、 关系测试-交集,差集,并集,反向差集,对称差集
nums = [1,2,3,2,3,4,1,5,6]
print(set(nums))
list = [1,2,3,4,5,3,6] #列表
list_dict = {2,3,4,3}
list_2 = [2,3,5,7,8]
list = set(list) #将列表转换为集合
list_2 = set(list_2)
print(‘交集:‘,list.intersection(list_2)) #交集,取出重复数据
print(list & list_2)
#这个也叫交集
print(‘并集:‘,list.union(list_2)) #并集,去重统一展示
print(list | list_2) #这个也叫并集
print(‘差集:‘,list.difference(list_2)) #差集,取出list中有的,list_2中没有的
print(list - list_2) #这个也叫差集
list_3 = set([1,3,6])
print(‘子集:‘,list_3.issubset(list)) #子集,list_3的值在list中全有,返回的是一个布尔类型的结果
print(‘父集:‘,list.issuperset(list_3)) #父集
print(‘对称差集:‘,list.symmetric_difference(list_2)) #对称差集,将list和list_2中互相没有的值都取出来,把两集合里都有的去掉
print(list ^ list_2) #这个也叫对称差集
#集合操作
list.add(123) #每次只能添加一个
print(list)
list.update([888,999]) #可以同时添加多个
print(list)
list.remove(999)
#删除指定元素
print(list)
list.pop() #随机删除
print(list)
list.discard() #删除一个不存在的元素不会报错
print(list)
实例:
#监控日志
#1、如果一分钟之内某个ip访问超过100次
#2、就把他的ip找出来,split,取第一个元素
#3、找出所有的ip,统计次数
#4、判断每个ip次数大于100,就发邮件
#5、记录文件指针,给下一次读的时候用
#6、等待60s,重新读取文件
import time
point = 0 #存放的是文件初始的位置
while True:
with open(‘access.log‘) as f:
f.seek(point)
ip_info = {} #存放ip和它出现的次数
for line in f:
ip = line.split()[0]
if ip in ip_info:
#ip_info[ip] = ip_info[ip] + 1
ip_info[ip] += 1
else:
ip_info[ip] = 1
point =
f.tell() #获取当前文件指针的位置
for k in ip_info:
if ip_info.get(k)
>= 100:
print(‘该ip在攻击你%s‘%k)
time.sleep(60) #等待60s
json是一个字符串,只不过长的像字典;
在json里只有双引号,没有单引号;
import json
user_info = ‘‘‘
{"test1":"123456","test2":"123456"}
‘‘‘
user_dic =
json.loads(user_info) #把json串(字符串)转换成字典
print(user_dic)
print(‘user_info‘,type(user_info))
print(‘user_dic‘,type(user_dic))
stu_info = {‘zhangsan‘:{‘cars‘:[‘BMW‘,‘Ben-z‘]}}
stu_str = json.dumps(stu_info) #把字典转换成json串
print(‘stu_str‘,type(stu_str))
print(stu_str)
f = open(‘stu.txt‘,‘w‘)
f.write(stu_str)
f.close()
f = open(‘stu.json‘, ‘w‘)
json.dump(stu_info,f,indent=4) #不需要自己在write,人家会帮你写入文件,后面加入indent=4帮你自动进行缩进,4表示缩进4个字符
3
函数
1、函数就是一个功能,一个方法,简化代码
2、函数必须得调用才会执行
3、一个函数只做一件事
4、重复的代码是低级的
5、实现同样的功能,代码越少越好
def say(name): #函数名,括号里写参数就是形参(形式参数即变量)
print(‘%s hahaha‘%name) #函数体
say(‘zhangshan‘) #函数名里面加括号就是调用上面的函数,括号里面的参数是实参(实际参数)
def say1(name,sex=‘男‘): #函数名,括号里写参数就是形参(形式参数即变量)
#必填参数,如name
#默认值参数,非必填,如sex=‘男‘
print(‘%s hahaha
性别%s‘%(name,sex)) #函数体
say1(‘zhangshan‘) #函数名里面加括号就是调用上面的函数,括号里面的参数是实参(实际参数)
在函数里面的变量都是局部变量,它只能在函数里面使用,函数执行结束就没有这个变量了;
返回值,如果需要用到函数的处理结果的话,就写return,不需要的话,那就不用写;函数里面如果碰到return,函数立即结束;
# 函数立即结束def calc(a,b):
res = a * b
print(res)
return res #没有return返回时,函数返回的数据类型就是NoneType,有return的类型就是函数的结果类型
cur_money = 8000
nx =
calc(1000,13)
print(nx+cur_money)
def
my():
for i in range(100)
if i == 2:
return
print(my())
#写一个校验输入的字符串是否为小数的程序
#思路:
# 1、0.12
1.23 -12.3只有一个小数点,判断小数点个数;
# 2、正小数的情况下,小数点左边和右边都是整数的话,才合法,通过分割符去判断
#3、负小数的情况下,小数点右边整数,左边必须是“-”开头,且只有一个负号;
#-5.4
#[‘-5‘,‘4‘]
#[1:]
def check_float(s):
s = str(s)
if s.count(‘.‘) == 1:
s_list = s.split(‘.‘)
#5.3 分割之后就是[5,3]
left = s_list[0]
#小数点左边
rigth = s_list[1]
#小数点右边
if left.isdigit()
and rigth.isdigit():
return True
elif left.startswith(‘-‘) and left.count(‘-‘) ==1
and left[1:].isdigit() and rigth.isdigit():
#left.count(‘-‘) ==1这个判断可以不用写
return True
return False
print(check_float(1.8))
print(check_float(-2.4))
print(check_float(‘-s.5‘))
print(check_float(‘50.232ss‘))
print(check_float(-3-4.4-9))
def my_file(name,content=None):
with open(name,‘a+‘) as f:
f.seek(0)
if content:
f.write(content)
else:
return f.read()
原文地址:https://www.cnblogs.com/better0903/p/9221844.html