day4

#文件操作

sample(序列a,n) #从序列a中随机抽取n个元素,并将n个元素以list形式返回
','.join() #以某个指定的分隔符将list变成字符串
import string,random
f=open('email.txt','w')
for i in range(10):
    u=''.join(random.sample(string.ascii_letters+string.digits,7))  #sample(seq, n)
    f.write(u+' ')

fw=open('nhy','w')
fw.write('sssssss')
fw.flush() #将缓存区里面的数据立即写到磁盘上
fw.close()

with open('nhy','w') as fw,open('nhy2','w') as fw2: #使用with打开多个文件,且能自动关闭文件
    fw.write('xxx')

#修改文件
# 1.简单粗暴直接的方式
1.先获取到文件里面的所有内容
2.然后修改内容
3.清空原来文件里面的内容
4.重新写入
f = open('users.txt','a+') #打开文件
f.seek(0) #移动指针
all_f=f.read() #读文件
new_f=all_f.replace('123456','python') #修改文件内容
f.seek(0) #读文件后指针就在最后面
f.truncate() #清空文件内容
f.write(new_f) #重新写入
f.flush()
f.close()
# 2.高效的处理方式
# words words
1.先打开原来的文件,再打开一个空文件
2.循环处理原来文件里面每一行数据,处理完之后,写到新文件里面
3.把原来的文件删除,把新文件的名字改成原来文件的名字

1、去掉前面的空格
2、把空行去掉
3、你替换you
4、写到新文件里
5、把原来的文件删除,把新文件的名字改成原来文件的名字
import os
with open('words') as fr,open('.words','w') as fw: #打开多个文件
    for line in fr: #使用for循环读每行数据
        line=line.lstrip() #去掉左边的空格
        if line: #跳过空行
            line=line.replace('你','you') #修改文件
    fw.write(line) #写入新文件
os.remove('words') #删除源文件
os.rename('.words','words') #重命名文件

# 1、监控日志
# { '192.168.1.1':0,'192.158.1.1':2 }
# [192,]
# 1、如果一分钟之内某个ip访问超过100次
# 2、就吧他的ip找出来,split,取第一个元素
# 3、找出所有的ip,统计次数
# 4、判断每个ip次数day100,就发邮件
# 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:
            p=line.split()[0]
            if ip in ip_info:
                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)

# 写一个注册小程序,注册成功后把账号/密码存到文件里
all_users={}
f=open('users.txt','a+') #文件句柄,文件对象
for i in range(3):
    u = input('user:').strip()
    p = input('p:').strip()
    cp = input('cp:').strip()
    if not u or not p or not cp:
       print('账号、密码不能为空')
    elif u in all_users:
        print('该用户已经被注册!')
    elif u not in all_users and cp==p:
        info = '%s,%s '%(u,p)
        f.write(info)
        break
f.close()


#写一个登录小程序,登录时从文件里获取账号密码,并判断
all_users={}
f=open('users.txt','a+')
f.seek(0)
for line in f:           #直接循环文件对象,每次循环的时候就是取的每一行数据
    line=line.strip()
    line_list=line.split(',')
    username=line_list[0]
    passwd=line_list[1]
    all_users[username]=passwd

    for i in range(3):
        u = input('user:').strip()
        p = input('p:').strip()
        if not u or not p:
            print('账号/密码不能为空')
       elif u not in all_users:
            print('用户不存在')
       elif p!=all_users.get(u):
            print('密码错误')
       else:
            print('登录成功')
            break
f.close()


# json
json是一个字符串,只不过长得像字典
在json串里只能写双引号


# json.loads()的用法-把json串转成字典:
# 把json串(字符串)转成字典
import json
user_info='''
{"nhy":"123456","lxy":"456789"}
'''
user_dict=json.loads(user_info)                      #把json串(字符串)转成字典

# 把文件里的json串转成字典
import json
f=open('stu.txt')
res=json.loads(f.read())       #使用json.loads()方法需要自己先读一次,入参是字符串

import json
f=open('stu.txt')
res=json.load(f)                   #使用json.load()方法这个是直接从文件里拿,入参是文件,不需要再读一次文件了,json帮你读


# json.dumps()的用法-把字典转成字符串:
# 把字典转成字符串
import json
stu_info = { 'laowang':{ 'cars':['BMW','Ben-z'] } }
stu_str=json.dumps(stu_info)                 #把字典转成json串(字符串)

#把字典转成的json串写到文件里
import json
stu_info = { 'laowang':{ 'cars':['BMW','Ben-z'] } }
stu_str=json.dumps(stu_info)                     #使用json.dumps()方法,需要自己写write,入参是字典
fw=open('stu.txt','w')
fw.write(stu_str)
fw.close()

import json
stu_info = { 'laowang':{ 'cars':['BMW','Ben-z'] } }
fw=open('stu.txt','w')         #打开一个文件
json.dump(stu_info,fw,indent=4)     #使用json.dump()方法不需要再write了,只需要传入文件对象,会自动写入文件

#json写上周的作业
import json
f=open('users.txt','a+') #文件句柄,文件对象
f.seek(0)
all_users=json.load(f)
for i in range(3):
    u=input('user:').strip()
    p=input('p:').strip()
    cp=input('cp:').strip()
    if not u or not p:
        print('账号/密码不能为空')
    elif u in all_users:
        print('该用户已经被注册')
    elif u not in all_users and cp==p:
        all_users[u]=p
        print('恭喜注册成功!')
        break
f.seek(0)
f.truncate()
json.dump(all_users,f,indent=4)
f.close()

# 集合
1.天生去重,可以循环
2.集合也是无序的

nums={6,7,1,2,3,4,5}
nums2={1,8,7,12}
nums3={1,2,3,4}

# 循环
for n in nums:
print(n)

# 交集
print(nums.intersection(nums2)) #取2个集合里面都有的
print(nums & nums2) #取2个集合里面都有的

# 并集
print(nums.union(nums2)) #合并到一起之后,再去重
print(nums|nums2) #合并到一起之后,再去重

# 差集
print(nums.difference(nums2)) #取在num中存在,在num2里面没有
print(nums-nums2) #取在num中存在,在num2里面没有

# 对称差集
print(nums.symmetric_difference(nums2)) #把俩集合里面都有的去掉
print(nums^nums2)

# 子集
print(nums3.issubset(nums)) #判断nums3是否是nums的子集

# 父集
print(nums.issuperset(nums3)) #判断nums是否是nums3的父集

# 新建
set1 = set() or set1 = {1,2,3}

# 增
nums.add(8) #增加一个元素
nums.update([9,10]) #增加多个元素

# 删
nums.remove(9) #删除元素,如果是不存在的元素会报错
nums.discard(0) #删除元素,如果是不存在的元素不会报错

# 改/查
查:无法通过下标索引
改:不可变类型无法修改元素

# 转变成list或tuple
转变成list:list(nums)
转变成tuple:tuple(nums)

# 校验密码
1.密码必须包含大写字母、小写字母、数字、特殊字符
import string
all_nums=set(string.digits)
lower=set(string.ascii_lowercase)
upper=set(string.ascii_uppercase)
punctuation=set(string.punctuation)
for i in range(5):
    pwd=input('pwd:').strip()
    pwd=set(pwd)
    if pwd & all_nums and pwd & lower and pwd & upper and pwd & punctuation:
        print('密码合法')
   else:
        print('密码不合法')

# 函数
1. 函数就是一个功能,一个方法,能简化代码;

# 定义函数
def say(name,sex='男'): #say是函数名;say括号里接收的name,sex是形参
print('%s哈哈哈 性别%s'%(name,sex) #函数体

# 函数的4种形参类型
# 1.位置参数-就是按照参数的位置来进行传参
def calc(x,y): #定义一个函数,参数有x和y,x和y就是形参,也是位置参数
print(x*y)
calc(5,2) #调用上面定义的函数,5和2就是实参
简单点说,形参就是函数接收的参数,而实参就是你实际传入的参数
# 2.默认参数
默认参数就是在定义形参的时候,给函数默认赋一个值,这样就算你在调用的时候没传入这个参数,它也是有值的;
默认参数不是必填的。如果使用默认值参数的话,必须放在位置参数后面定义;
def say(name,sex='男'): #sex就是一个默认值参数
print(name,sex)
say('luxi') #调用,没指定默认值
say('luxi',sex='女') #调用,指定默认值参数的值
# 3.可变参数
可变参数用*来接收,后面想传多少个参数就传多少个;
可变参数必须在位置参数和默认值参数后面。可变参数也是非必传的;
def more_arg(name,age,*agrs): #*agrs是可变参数,调用的时候可变参数会把后面多传的参数都放到args这个元组中
print(name,age,agrs)
more_arg('Marry', 18, 'nv', 'python', 'China') # 调用
# 4.关键字参数
关键字参数使用**来接收,后面的参数也是不固定的,想写多少个写多少个;
当然也可以和上面的几种一起来使用,如果要一起使用的话,关键字参数必须在最后面;
使用关键字参数的话,调用的时候必须使用关键字传参。关键字参数也是非必传的;
def kw_arg(name,**kwargs): #name位置参数、**kwargs关键字参数,调用的时候会把传入的关键字参数放到kwargs这个字典中
print(name, kwargs)
kw_arg('sriba', sex='男', age=18) #调用,sex和age就是关键字调用

# 变量
在函数里面的变量全都是局部变量,它只能在函数里面使用,函数执行结束那么没有这个变量

函数的返回值
每个函数都有返回值,如果没有在函数里面指定返回值的话,在python里面函数执行完之后,默认会返回一个None;
如果需要用到函数的处理结果的话,那么就写return,不需要的话,那就不用写;
函数里面如果碰到return,函数立即结束;
def calc(a,b):
res=a*b
return res #这个就是定义了一个有返回值的函数
res=calc(6,6) #把函数的返回结果赋值给res
print(res)

def my():
for i in range(100):
    print(i)
    if i==2:
        return #碰到return,函数立即结束
my()

# 写一个校验输入的字符串是否为小数的程序
# 1、只有一个小数点 判断小数点个数
# 2、 正小数的情况下,小数点左边和右边都是整数的话,才合法 [0 ,12]
# 3、负小数的情况下 小数点右边整数,左边 必须以负号开头,只有一个负号。
def check_float(s):
    s=str(s)
    if s.count('.')==1:
        s_list=s.split('.')
        left=s_list[0] #小数点左边
        right=s_list[1] #小数点右边
        if left.isdigit() and right.isdigit(): #这里是判断正小数的
            return True
        elif left.startswith('-') and left[1:].isdigit() and right.isdigit():
            return True
    return False
print(check_float(0.25))

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/you-shu/p/9174769.html