python基础学习3-文件读写、集合、json、函数

 

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))        #对称差集,将listlist_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()

猜你喜欢

转载自www.cnblogs.com/better0903/p/9221844.html