目录

Python文件操作学习笔记

一、前言

  • Python对文件的操作是相当简单的。

二、文件操作函数的介绍

  • Python 通过open函数来打开文件,语法如下

open(file, mode=‘r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True)

  • 可以看到,除了第一个file参数是必须的,其它都是可选的。
  • 1、file:操作的文件
  • 2、mode:操作模式,默认为’r’,表示读模式。其它模式为

‘r’:读模式 ‘w’:写模式 ‘a’:追加模式 ‘b’:二进制模式(可添加到其它模式中使用,如rb表示二进制读,一般用来读一些视频或者音频文件) ’+’:读/写模式(可添加到其它模式中使用,如r+ 表示可读写)

  • 3、buffering:是否有缓冲,默认是无缓冲,如果传0或者False也是无缓冲,如果传1或者True默认是有缓冲。使用缓冲的好处是提高程序的执行速度,但是使用缓冲的话需要注意:一定要执行flush或者close时缓冲中的数据才会同步到硬盘上。如果传递大于1,如1024则代码缓冲的大小,表示1M。
  • 4、encoding:指明对文件编码,仅适用于文本文件。如果不明编码方式,默认是使用locale.getpreferredencoding()函数返回的编码方式。
  • 5、errors:指明编码和解码错误时怎么样处理。不能在二进制的模式下使用。

1、设置’strict’则编码出错则抛出异常ValueError。 2、设置’ignore’则忽略错误。 3、设置’replace’则使用某字符进行替代模式,比如使用’?’来替换出错的。 4、其它少用的还有surrogateescape/xmlcharrefreplacs/backslashreplace。

  • 6、newline:在文本模式之下时,控制一行的结束字符。可以是None,’’,\n,\r,\r\n等。
  • 7、closefd:是用来当给一个文件句柄传进来时,而当退出文件使用时,而不对文件句柄进行关闭。如果传递一个文件名进来,这个参数无效,必定为True方式。

三、使用方法

  • 我们通过编写demo来学习文件的操作方法。

  • 如下,如果my_file.txt不存在,会自动创建,模式为写模式

      f = open('my_file.txt',mode='w');
      f.write('hello world!');
      f.close();
    
  • 执行完上面代码之后,你应该会发现当前目录下多出了一个my_file.txt文件。

  • 如果我们的mode保持默认的操作模式,默认为读,那么程序就会报错,修改代码如下

      f = open('my_file.txt');
      f.write('hello world!');
      f.close();
    
  • 执行时你会发现,程序报错了,所以如果要写数据到文件记得要修改操作模式哦。

  • 我们也可以直接写入一个数据集合

      f = open('my_file.txt',mode='w');
    
      data=['hello word!\n','yes!']
      f.writelines(data)
      f.close();
    
  • 当然,我们还可以随自己所想,如果文件中已存在内容,我们可以指定从哪点开始写

      f = open('my_file.txt',mode='w');
    
      f.write("hello word!")
      f.seek(2)
      f.write("xxxxxxxx")
      f.close();
    
      f = open('my_file.txt',mode='r');
      print(f.read())
      f.close()
    
  • 执行结果为:hexxxxxxxx! 你会发现,确实是从第2个开始写xxxxxxxx

  • OK,我们看一下如何读文件中的数据,file对象提供了三个方法进行读操作

1、read : 每次读取整个文件,通常将文件内容读取出来存放到一个字符串变量中。对于过大的文件则会出现问题 2、readline :每次只读取一行。 3、readlines :每次读取整个文件,读取后自动将文件内容分析成一个行的列表,该列表可以由 for… in … 进行遍历处理。

  • 三个方法都可以传入一个变量控制每次读取的数据量。如:假设以字符模式读取read(4)表示读前4个字符数据。

  • 示例代码如下

      f = open('my_file.txt',mode='w');
      f.write('hello world!');
      f.close();
    
      f = open('my_file.txt',mode='r');
      print(f.read())
      f.close();
    
      f = open('my_file.txt',mode='r');
      print(f.readline())
      f.close();
    
      f = open('my_file.txt',mode='r');
      print(f.readlines())
      f.close()
    
  • 输出如下:

      hello world!
      hello world!
      ['hello world!']
    
  • 因为内容只有一行,所以f.read()和f.readline()读到的数据是一样的。而f.readlines()则返回一个列表类型的结果。

  • 一般情况下,小文件可以优先考虑使用read和readlines,因为一次性读取文件,性能会好一些,当然是在文件不大, 内存足够的情况下,如果是大文件只能使用readline一行一行来了。

读取大文件推荐方法

  • 1、读取大文件是,可以使用fileinput模块,其已包含了打开文件的函数,我们只需要传递文件名给它就可以了

  • 示例代码:

      import fileinput
    
      for line in fileinput.input('my_file.txt'):
      	print(line)