欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

文件操作

程序员文章站 2024-03-25 14:05:04
...

Python读写文件模式

1、r 打开只读文件,该文件必须存在。
2、r+ 打开可读写的文件,该文件必须存在。
3、w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
4、w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
5、a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
6、a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

1、r 打开只读文件,该文件必须存在。

#已创建a.txt文件
文件操作
f.read() # 读所有东西,返回字符串

f = open('a.txt','r',encoding='utf-8')
result1 = f.read()# 读所有东西,返回字符串
print(result1)

输出结果:
C:\Users\m\AppData\Local\Programs\Python\Python38\python.exe D:/Python/project/geng_juans_homework/day3/操作文件.py
大理
丽江

Process finished with exit code 0

f.readlines() #读所有东西,返回列表

f = open('a.txt','r',encoding='utf-8')
result2 = f.readlines()#读所有东西,返回列表
print(result2)

输出结果:
C:\Users\m\AppData\Local\Programs\Python\Python38\python.exe D:/Python/project/geng_juans_homework/day3/操作文件.py
['大理\n', '丽江']

Process finished with exit code 0

f.readline() #只读一行

f = open('a.txt','r',encoding='utf-8')
result3 = f.readline()#只读一行
print(result3)
print(f.readline())#再读一行

输出结果:
C:\Users\m\AppData\Local\Programs\Python\Python38\python.exe D:/Python/project/geng_juans_homework/day3/操作文件.py
大理

丽江

Process finished with exit code 0

2、r+ 打开可读写的文件,该文件必须存在。

3、w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

f = open('a.txt','w',encoding='utf-8')
f.write('再见')#只能写字符串
f.close()#写完文件后必须要关闭文件

输出结果:
文件操作
#换行输入

f = open('a.txt','w',encoding='utf-8')
addr = ['大理\n','丽江']#可换行输写入文件
f.writelines(addr)#有循环功能,可以写入list,只能写字符串
f.close()

输出结果:
文件操作

f = open('a.txt','w',encoding='utf-8')
addr = ['大理\n','丽江']#可换行输写入文件
f.writelines(addr)#有循环功能,可以写入list,只能写字符串
f.close()

输出结果:
文件操作

4、w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

5、a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

6、a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

在文件最前面添加
f = open('a.txt','a+',encoding='utf-8')
f.write('\n香格里拉')#在文件末尾写入'香格里拉'
f.seek(0)#文件指针一道最前面
result = f.read()#读出所有内容
new_result = '龙龙\n'+result#把'龙龙'拼接在文件最前面,此时字符串名为new_result
f.close()
f2 = open('a.txt','w',encoding='utf-8')#再次打开并清空文件a.txt
read_new_result = f2.write(new_result)#读在开头写入'龙龙'后的文件,new_result结果
f.close()

输出结果:
文件操作

清空文件
f = open('a.txt','a+',encoding='utf-8')
f.write('\n香格里拉')#在文件末尾写入'香格里拉'
f.seek(0)#文件指针一道最前面
result = f.read()#读出所有内容,此时文件指针在最前面
new_result = '龙龙\n'+result#把'龙龙'拼接在文件最前面,此时字符串名为new_result
f.seek(0)#文件指针挪到最前面,才能清空文件所有内容
f.truncate()
f.write(new_result)#读在开头写入'龙龙'后的文件,new_result结果
f.close()

输出结果:
文件操作

文件指针

当我们读取文件内容时,并不能重复的读取,比如一个blog.txt文件里有blog内容,用两个read()方法读取blogCblog.txt的内容,会发现,第一个返回文件内容,第二个返回‘’。并不能重复读取,如果我想重复读取呢?怎么解决。

其实这跟文件指针有关,当我们对文件操作时,文件内部会有一个
文件指针来定位当前位置,如图:

文件操作

with 自动打开/关闭文件,不需要再次关闭文件

with open(‘words.txt’) as fr

大文件操作

读出文件内容

with open('geng.txt',encoding='utf-8') as f:#f是文件对象,文件句柄
    for line in f:#直接循环f的每一行,输出的就是文件的内容
        line = line.strip()#如果有空行/头尾空格,去除
        if line:#如果line不为空
            print(line)#输出每一line的内容
输出结果:
啦啦啦
撒大声地所,胜多负少的
宋丹丹个人,一跑
饿货,一一

修改文件内容


#1、读取到文件所有内容
#2、替换 new_str
#3、清空原来的文件
#4、写进去新的
import os
with open('word.txt') as fr,open('new_word.txt','w')as fw:#打开原文件,再新建一个新文件做文件写入使用
    for line in fr:#读出fr里面的全部内容
        line = line.strip()#去除每一行的空格
        if line:#如果line不为空
            line = line.lower()#将每行内容切换小写
            fw.write(line+'\n')#文件内容换行输出,因为上面做了去除空格和去除换行操作
os.remove('word.txt')#删除旧文件
os.rename('new_word.txt','word.txt')#新文件名替换成旧文件名

练习

1、监控日志文件,找到每分钟请求大于200的ip地址,加入黑名单

#1、监控日志文件,找到每分钟请求大于200的ip地址,加入黑名单

import time
point = 0
while True:
    ips = {}#字典需要定义在循环里面,如果定义在外面,字典会越来越大,已经读过的ip还会再加到字典里
    f = open('access.log', encoding='utf-8')
    f.seek(point)#定义文件指针,每次指针指向上次ip出现的位置
    for line in f:
        line = line.strip()
        if line:
            ip = line.split()[0]#文件以空格做分割,取第一位就是ip
            if ip in ips:
                ips[ip] +=1#python,统计字典中的key出现的次数
            else:
                ips[ip] = 1#python,统计字典中的key出现的次数
    point = f.tell()#记录当前文件指针的位置
    f.close()
    for ip in ips:
        count = ips[ip]
        if count>200:
            print('要加入黑名单的ip地址是:{},已出现{}次'.format(ip,count))
    time.sleep(60)
   
  输出结果:
  要加入黑名单的ip地址是:121.69.45.254,已出现203