• 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
  • 相关阅读:
    read 命令详解
    rpm 命令详解
    random 模块
    time 模块
    Numpy 数据类型和基本操作
    numpy 数组对象
    netstat 命令详解
    free 命令详解
    Python中*args和**kwargs 的简单使用
    Numpy 数组简单操作
  • 原文地址:https://www.cnblogs.com/beginner-boy/p/12507128.html
Copyright © 2020-2023  润新知