一文彻底搞懂python文件读写

独自空忆成欢 提交于 2020-08-12 14:03:12

Python文件读写

一,I/O操作

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

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

  • 硬件驱动
  • 进程管理
  • 内存管理
  • 网络管理
  • 安全管理
  • I/O管理

二,文件读写原理及操作步骤

1. 文件读写实现原理

文件读写就是一种常见的IO操作。那么根据上面的描述,可以推断python也应该封装操作系统的底层接口,直接提供了文件读写相关的操作方法。

我们将数据写入文件时,操作系统不会立刻把数据写入磁盘,而是先把数据放到内存缓冲区异步写入磁盘。当调用close方法时,操作系统会保证把没有写入磁盘的数据全部写到磁盘上,否则可能会丢失数据,所以,*文件读写操作完成后,应该及时关闭*

2. 文件读写操作步骤

1)打开文件,获取文件描述符

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

3)关闭文件

三,python文件打开模式

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

r+,w+,a+区别:

  • r+会覆盖当前文件指针所在位置的字符,如原来文件内容是"Hello,World",打开文件后写入"hi"则文件内容会变成"hillo, World"
  • w+与r+的不同是,w+在打开文件时就会先将文件内容清空,不知道它有什么用
  • a+与r+的不同是,a+只能写到文件末尾(无论当前文件指针在哪里)

四,python代码实现

初级:

# 第一步:(以只读模式)打开文件
f = open('song.txt', 'r', encoding='utf-8')
 
# 第二步:读取文件内容
print(f.read())
 
# 第三步:关闭文件
f.close()

中级:

f = ''
try:
    f = open('song.txt', 'r', encoding='utf-8')
    print(f.read())
    num = 10 / 0
finally:
    print('>>>>>>finally')
    if f:
        f.close()

最佳:

with语句会在其代码块执行完毕之后自动关闭文件。

with open('song.txt', 'r', encoding='utf-8') as f:
    print(f.read())
print(f.closed)

五,Python文件读取相关方法

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

此外,还要两个与文件指针位置相关的方法

方法 描述
seek(n) 将文件指针移动到指定字节的位置
tell() 获取当前文件指针所在字节位置
  1. 读取指定长度的内容

    with open('song.txt', 'r', encoding='utf-8') as f:
        print(f.read(12))
    
  2. 读取文件中的一行内容

    with open('song.txt', 'r') as f:
        print(f.readline().decode('utf-8'))
    

3.遍历打印一个文件中的每一行

方式一:先一次性读取所有行到内存,然后再遍历打印

with open('song.txt', 'r', encoding='utf-8') as f:
    for line in f.readlines():
        print(line)

这种方式的缺点与read()方法是一样的,都是会消耗大量的内存空间。

方式二:通过迭代器一行一行的读取并打印

with open('song.txt', 'r', encoding='utf-8', newline='') as f:
    for line in f:
        print(line)

file类的其他方法:

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

encoding(编码)参数的默认值是与平台有关的,比如Window上默认字符编码为GBK,Linux上默认字符编码为UTF-8。

decoding(解码)

六,结语

前面花了几天时间复习python基础语法和面向对象知识,现在开始除了每天上网课外,就会抽时间深入学习python相关知识,继续加油,奥里给!!

道友们可以加我的微信公众号 梦码城 ,接下来的日子里我会在公众号上发布各种与编程方面的总结学习知识,也会送各位小伙伴大量的学习资源,梦码城,期待你的加入
文章不易,道友们点个赞加个关注鼓励下梦码呗

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!