Python学习笔记(九)—文件的操作

总结内容:

  1、文件的基本操作步骤

  2、文件的打开方式

  3、操作文件用到的方法

  4、练习

 一、文件的基本操作步骤

  1、找到操作的文件(如果在同一目录下使用相对路径;如果不在相同目录下要使用绝对路径)

  2、打开文件

  3、操作文件进行读写

  4、关闭文件

二、文件的打开方式

  1、open()方法

    open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

    格式:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

    参数说明:

      file: 必需,文件路径(相对或者绝对路径)。

      mode: 可选,文件打开模式

      buffering: 设置缓冲

      encoding: 一般使用utf8

      errors: 报错级别

      newline: 区分换行符

      closefd: 传入的file参数类型

      opener:

    说明:使用open方式打开文件,最后一定要记得使用close方法关闭文件

1 #打开test.txt文件
2 f = open('test.txt') #test.txt文件同py文件在同一目录下
3 print(f.read())  #读取文件中的所有内容
4 f.close() #关闭文件
View Code

  2、使用with方式打开文件,使用该方式打开文件后,会自动关闭打开的文件

    格式:with  open(文件,操作方式) as  文件别名:

          操作文件主体

with open('test.txt','a') as f: #以最近方式对文件进行操作
    f.write('test11') #往文件中写入数据
View Code

三、操作文件用到的方法

  说明:文件操作的模式包括:读、写、追加三种模式,默认读模式

    r:以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式;如果文件不存在,程序将会报错

    rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等

     r+:打开一个文件用于读写。文件指针将会放在文件的开头。打开不存在的文件,程序报错;可以写入内容但是写入的内容会从文件的顶部开始覆盖原文件

    w:打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

    wb:以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。

     w+:打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。可以写入内容,但是由于会清空内容,所以返回值都是空

     a:打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

    ab:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

     a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。常用模式,既可以读文件也可以写文件

  1、读文件的方法 

    read()方法:读取文件中的所有内容,以字符串的方式进行展示。

f = open('test.txt','r+')
res = f.read()
print(res)
f.close()

运行结果:
test11
View Code

    readline()方法:获取文件中的每一行的内容,以字符串形式展示

1 f = open('test.txt')
2 print(f.readline())  #打印第一行内容
3 print(f.readline())  #打印第二行内容
4 f.close()
5 
6 运行结果:
7 test11
8 test12
View Code

    readlines()方法:获取文件中所有的内容,以字符的形式展示

1 f = open('test.txt')
2 print(f.readlines())  #读取所有内容
3 f.close()
4 
5 运行结果:
6 ['test11
', 'test12
', 'test13
', 'test14
', 'test15
']
View Code

  2、写文件方法

    write()方法:向文件中写入指定字符串

1 f = open('test.txt','w')
2 f.write('test16')
3 f.close()
4 f = open('test.txt')
5 print(f.read())
6 f.close()
7 
8 运行结果:
9 test16
View Code

    writelines()方法:向文件中写入一序列的字符串

 1 a = ['list1
','list2
','list3
']
 2 f = open('test.txt','w')
 3 f.writelines(a)
 4 f.close()
 5 f = open('test.txt')
 6 print(f.read())
 7 f.close()
 8 
 9 运行结果:
10 list1
11 list2
12 list3
View Code

  3、修改文件内容

    方式一:

1 f = open('users.txt')
2 res = f.read().replace('test','wyh')
3 f.close()
4 f = open('users.txt','w')
5 f.write(res)
6 f.close()
View Code

    方式二:

1 f = open('users.txt','a+')
2 f.seek(0)  #将文件指针移动文件开始位置
3 res = f.read().replace('test','list')  #将文件内容中的test修改为list
4 f.seek(0)
5 f.truncate()   #清空文件里面的内容
6 f.write(res)
7 f.close()
View Code

    方式三:

 1 import os  #导入os模块
 2 f = open('users.txt')
 3 f2 = open('users.txt.bat','w')
 4 for line in f:
 5     new_line  = line.replace('list','test')  #将文件内容中的list修改为test
 6     f2.write(new_line)  #将修改的内容,添加到文件2中
 7 f.close()
 8 f2.close()
 9 os.remove('users.txt')  #删除原文件
10 os.rename('users.txt.bat','users.txt')   #将修改后的问题重命名
View Code

  4、打开二进制文件并保存

1 import requests   #导入requests模块
2 url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1584945092&di=ba5f1891ad196f22cb25394d459780d5&imgtype=jpg&er=1&src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farchive%2F40bbc6dc7f5691d5ee1e4f1aeaa307f4f745ee41.jpg'
3 res = requests.get(url).content  #打开URL地址并以二进制形式进行读取
4 f = open('changba.jpg','wb') #以读模式打开文件
5 f.write(res)
6 f.close()
View Code

  5、文件的高效处理

  首先处理文件中的内容的流程大概是:CPU-->内存-->磁盘;首先把数据从磁盘中取出并放入到内存中,然后CPU处理的时候直接从内存中读取。但是内存的大小是有限制的,如果我们打开一个特别的大的文件,如果一下将所有内容都读取到内存势必会给内存带来很大的压力,所以处理大文件的时候我们尽量是逐行去处理。逐行读取代码的示例如下:

 1 #使用while循环方式,读取文件
 2 f = open('users.txt',encoding='utf-8')
 3 while True:
 4     line = f.readline()
 5     if line != '':
 6         print('line:',line)
 7     else:
 8         print('end')
 9         break
10 f.close()
11 
12 #使用for循环方式,读取文件
13 f = open('users.txt',encoding='utf-8')
14 f.seek(0)
15 for line in f:
16     print(line)
17 f.close()
View Code

  6、其它方法

    seek()方法:确定文件指针的位置

    flush()方法:刷新缓冲区,即立即把缓冲区里面的内容写入磁盘

    tell()方法:记录文件指针的当前位置

    truncate()方法:清空文件的内容,需要配和指针使用
    注意:如果写入文件报错的话需要制定字符编码

 四、练习

   练习:监控日志
    1、从日志里面找到,1分钟之内超过20次访问的IP
    2、脚本每分钟运行一次
   思路:
    1、读取文件内容,获取IP地址
    2、把每个IP地址存起来,使用字典存储(避免重复)
    3、判断IP访问的次数是否超过20次
    4、加入黑名单

 1 import time
 2 point = 0
 3 while True:
 4     ips = {}
 5     f = open(r'C:UsersAdministratorDesktopaccess.log', encoding='utf-8')  #文件前边加入r代表路径中的特殊字符不会被转义
 6     f.seek(point)
 7     for line in f:
 8         ip = line.split()[0]
 9         if ip in ips:
10             ips[ip] += 1
11         else:
12             ips[ip] = 1
13     point = f.tell()  # 记录文件指针的位置
14     for ip, count in ips.items():
15         if count >= 20:
16             print('%s  加入黑名单!' % ip)
17     f.close()
18     time.sleep(60)
View Code
原文地址:https://www.cnblogs.com/beginner-boy/p/12507128.html