Python文件读取与操作


找到一篇非常好的文章,记录下

原贴:https://www.cnblogs.com/yyds/p/6186621.html

I/O操作概述

I/O在计算机中是指Input/Output,也就是Stream(流)的输入和输出。这里的输入和输出是相对于内存来说的,Input Stream(输入流)是指数据从外(磁盘、网络)流进内存,Output Stream是数据从内存流出到外面(磁盘、网络)。程序运行时,数据都是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方(通常是磁盘、网络操作)就需要IO接口
那么这个IO接口是由谁提供呢?高级编程语言中的IO操作是如何实现的呢?

操作系统是个通用的软件程序,其通用目的如下:

硬件驱动
进程管理
内存管理
网络管理
安全管理
I/O管理
操作系统屏蔽了底层硬件,向上提供通用接口。因此,操作I/O的能力是由操作系统的提供的,每一种编程语言都会把操作系统提供的低级C接口封装起来供开发者使用,Python也不例外。

文件读写实现原理与操作步骤

文件读写实现原理

文件读写就是一种常见的IO操作。python也是通过封装操作系统的底层接口,直接提供了文件读写相关的操作方法。

那么我们要操作的对象是什么呢?我们又如何获取要操作的对象呢?

由于操作I/O的能力是由操作系统提供的,且现代操作系统不允许普通程序直接操作磁盘,所以读写文件时需要请求操作系统打开一个对象(通常被称为文件描述符–file descriptor, 简称fd),这就是我们在程序中要操作的文件对象。

通常高级编程语言中会提供一个内置的函数,通过接收"文件路径"以及“文件打开模式”等参数来打开一个文件对象,并返回该文件对象的文件描述符。因此通过这个函数我们就可以获取要操作的文件对象了。这个内置函数在Python中叫open()返回的是一个对象,这个对象就是代表了当前打开的文件。

文件读写操作步骤

操作文件读写的步骤基本一样:
1.打开文件,获取文件描述符;

2.操作文件描述符–读/写;

3.关闭文件。
注意:文件读写完毕之后,应该及时关闭。其一,文件操作对象会占用操作系统资源,其二,有可能会造成写入数据的丢失。因为将数据写入文件时,操作系统不会立刻把数据写入磁盘,而是先把数据放到内存缓冲区异步写入磁盘。当调用close方法时,操作系统会保证把没有写入磁盘的数据全部写到磁盘上,否则可能会丢失数据

文件的打开模式

Python的文件打开模式有如下几种:
文件打开模式(“mode=”) 描述
r : 以只读模式打开文件,并将文件指针指向文件头;如果文件不存在会报错
w : 以只写模式打开文件,并将文件指针指向文件头;如果文件存在则将其内容清空,如果文件不存在则创建
a : 以只追加可写模式打开文件,并将文件指针指向文件尾部;如果文件不存在则创建
r+ : 在r的基础上增加了可写功能
w+ : 在w的基础上增加了可读功能
a+ :在a的基础上增加了可读功能
b :读写二进制文件(默认是t,表示文本),需要与上面几种模式搭配使用,如wb, ab, ab+(POSIX系统,包括Linux都会忽略该字符)
需求:在目标文件中新加部分内容
Python文件读取与操作
运行结果:
Python文件读取与操作

Python文件读取相关方法

我们知道,对文件的读取操作需要将文件中的数据加载到内存中,而上面所用到的read()方法会一次性把文件中所有的内容全部加载到内存中。这明显是不合理的,当遇到一个几个G的的文件时,必然会耗光机器的内存。这里我们来介绍下Python中读取文件的相关方法:

方法 描述
read() : 一次读取文件所有内容,返回一个str;
read(size) : 每次最多读取指定长度的内容,返回一个str;在Python2中size指定的是字节长度,在Python3中size指定的是字符长度;
readlines(): 一次读取文件所有内容,按行返回一个list;
readline(): 每次只读取一行内容。

此外,还有两个与文件指针位置相关的方法:
方法 描述
seek(n):将文件指针移动到指定字节的位置;
tell() :获取当前文件指针所在字节位置。
需求:读取方法
Python文件读取与操作
file类的其他方法:
方法 描述
flush(): 刷新缓冲区数据,将缓冲区中的数据立刻写入文件;
next() :返回文件下一行,这个方法也是file对象实例可以被当做迭代器使用的原因;
truncate([size]) :截取文件中指定字节数的内容,并覆盖保存到文件中,如果不指定size参数则文件将被清空; Python2无返回值,Python3返回新文件的内容字节数;
write(str) :将字符串写入文件,没有返回值;
writelines(sequence) :向文件写入一个字符串或一个字符串列表,如果字符串列表中的元素需要换行要自己加入换行符;
fileno(): 返回一个整型的文件描述符,可以用于一些底层IO操作上(如,os模块的read方法);
isatty() :判断文件是否被连接到一个虚拟终端,是则返回True,否则返回False。