文件的步骤:
1、有个文件
2、打开文件
3、操作文件 读、写
4、关闭

文件打开的三种模式:
r:只读模式,默认的,打开文件不存在的话,会报错
w:只写模式,会清空原来文件的内容,打开的文件不存在的话,会帮你新建一个文件
a:追加写模式,不能读,打开的文件不存在的话,也会帮你新建一个文件,a+能读能写

r+:读写模式,打开不存在的文件会报错
w+:写读模式,可读,但还是会把原来的文件清空
a+:追加读模式,打开的文件不存在的话,也会帮你新建一个文件

rb  wb  ab+:使用二进制的方式打开,比如打开图片、mp3等格式文件,即除了文本文件的其他格式文件;
  B表示二进制,O表示八进制,D表示十进制,H表示十六进制

#file('a.txt','w')   python2中的方法,python3里不用这个方法
--------------------------------------------------------------------------------

f = open('users.txt')
print(f.read())#获取到文件里面所有的内容,文件读到的都是字符串
f.close()
--------------------------------------------------------------------------------

f = open('users.txt')
print(f.read())
f.write('yangfan,12345\n')  #只能写入字符串
f.close()
#会报错,文件不可写

--------------------------------------------------------------------------------

f = open('users.txt','w')
print(f.read())
f.write('yangfan,12345\n')
f.close()
#会报错,文件不可读
--------------------------------------------------------------------------------

f = open('users.txt','w')
f.write('yangfan,12345\n')
f.close()
#之前的内容丢失,只剩新加的内容
--------------------------------------------------------------------------------

f = open('users.txt','a+')
print(f.read())
f.write('yangfan,12345\n')
f.close()
#文件指针在最后,文件添加到最后,但是不可读,因为从文件指针往后读,后面并没有内容
--------------------------------------------------------------------------------

f = open('users.txt','a+')
f.seek(0)#移动文件指针
print(f.read())
f.write('yangfan,12345\n')
f.close()
#打印:
abc,123
bcd,456
#因为先读后写
--------------------------------------------------------------------------------

f = open('users.txt','a+')
f.seek(0)
print(f.read())
f.write('yangfan,12345\n')
f.flush()   #刷新
f.close()
--------------------------------------------------------------------------------

f = open('users.txt',encoding='utf-8')
print(f.readlines())  #获取到文件里面所有的内容,但是返回的是list ,直接将每行进行分割
#打印:
 ['username,123456\n', 'username1,abc456\n', 'username2,111116\n']
f.close()

--------------------------------------------------------------------------------

print(f.readline())#读取一行,一行一行读取,读取下一行,要再输入一遍命令
--------------------------------------------------------------------------------

f = open('users.txt','a',encoding='utf-8')
a=['username1,12345\n','username2,123456\n']
f.writelines(a)    #自动循环list添加
#等于for i in a:
#        f.write(i+'\n')
--------------------------------------------------------------------------------

u='abc,123'   
#字符串也可以循环,但是使用writelines浪费效率,因为字符串写入不需要循环,写入字符串只需要write就好
f.writelines(u)
--------------------------------------------------------------------------------

import requests
url='https://aliuwmp3.changba.com/userdata/video/35026AD35B136F789C33DC5901307461.mp4'
res=requests.get(url).content
f=open('changba.mp4','wb')  #以二进制方式写入
f.write(res)

#爬虫,下载一首歌
--------------------------------------------------------------------------------

高效处理文件:
f为文件对象或文件句柄
第一种方式:
while True:    #建一个死循环
    line = f.readline()     #一次只读取一行,避免大数据时占用内存
    if line!='':     #如果没有读到空数据,空行也可以打印,空行不代表空字符串
        print('line:',line)    #打印
    else:
        print('文件内容都读完了,结束了')
        break

第二种方式:
for line in f:
    print(line)
--------------------------------------------------------------------------------

监控日志:
说明:
#1、要从日志里面找到1分钟之内访问超过200次的
#2、每分钟都运行一次
思路:
# 1、读取文件内容,获取到ip地址
# 2、把每个ip地址存起来 {},用字典比list有效率
# 3、判断ip访问的次数是否超过200次
# 4、加入黑名单 print

import time
point = 0 #初始的位置
while True:
    ips = {}   #定义在循环内,每次执行后置空,方便下个60s的数据填入
    f = open('access.log',encoding='utf-8')  #打开文件
    f.seek(point) #从记录的位置开始读
    for line in f: #循环取文件里面每行数据
        ip = line.split()[0] #按照空格分割,取第一个元素就是ip
        if ip in ips:#判断这个ip是否存在
            # ips[ip] = ips[ip]+1 同下行代码
            ips[ip]+=1#如果存在的话,次数加+1
        else:
            ips[ip]=1 #如果不存在ip的次数就是1
    point = f.tell() #记录文件指针位置
    f.close()
    for ip,count in ips.items():#循环这个字典,判断次数大于200的
        if count>=200:
            print('%s 加入黑名单'%ip)
    time.sleep(60)
--------------------------------------------------------------------------------

使用绝对路径时,避免比如字符串中\n使用换行作用,不让转义,在路径前加r
f = open(r'C:\Users\nhy\Desktop\file.txt',encoding='utf-8')

修改小文件内容:
处理小文件的方法,以下方法占内存,一次性的读取文件到内存:

#1、简单、粗暴直接的
f = open(r'C:\Users\nhy\Desktop\file.txt',encoding='utf-8')  #以读的方式打开一个文件
res = f.read().replace('一点','二点')#读取文件并将“一点”替换成“两点”,该行代码等同于res = f.read()   res.replace
f.close()#关闭文件
f = open(r'C:\Users\nhy\Desktop\file.txt',mode='w',encoding='utf-8')#以写的方式再次打开文件,清空之前的内容,mode=可以删除,只留‘w’也可以
f.write(res)#写入替换的文件
f.flush() #立即把缓冲区里面的内容,写到磁盘上
f.close()

2.另一种
f = open('file.txt','a+',encoding='utf-8')
f.seek(0)
res = f.read().replace('你','NI')
f.seek(0)#再次将文件指针移到最前
f.truncate() #清空文件里面的内容
f.write(res)
f.close()
--------------------------------------------------------------------------------

修改大文件内容:
按行读写的方法:
import os  #调用系统模块
f = open('file.txt',encoding='utf-8')
f2 = open('file.txt.bak','w',encoding='utf-8')
for line in f:
    new_line = line.replace('一点','二点')
    f2.write(new_line)#按行将f中的每一行写到f2中
f.close()
f2.close()
os.remove('file.txt')#删除f
os.rename('file.txt.bak','file.txt')#将f2重命名为f
--------------------------------------------------------------------------------

使用with判断用完文件后,会自动关闭文件:

import os  #调用系统模块
with open('file.txt',encoding='utf-8') as f, open('file.txt.bak','w',encoding='utf-8') as f2:
#打开两个文件用逗号隔开
    for line in f:
        new_line = line.replace('二点','一点')
        f2.write(new_line)
os.remove('file.txt')
os.rename('file.txt.bak','file.txt')