天天看点

网络编程(part2)--文件读写之打开/读取/写入

鄙人学习笔记

文章目录

  • ​​文件读写​​
  • ​​打开文件​​
  • ​​举个例子1(以读方式打开)​​
  • ​​举个例子2(以写方式打开)​​
  • ​​读取文件​​
  • ​​read​​
  • ​​举个例子1​​
  • ​​readline​​
  • ​​举个例子2(继续用例子1的note.txt文件)​​
  • ​​readlines​​
  • ​​举个例子3​​
  • ​​for循环​​
  • ​​举个例子4​​
  • ​​写入文件​​
  • ​​write​​
  • ​​举个例子1​​
  • ​​writelines​​
  • ​​举个例子2​​
  • ​​举个例子3(以追加模式写入)​​

文件读写

对文件实现读写的基本操作步骤为:打开文件,读写文件,关闭文件。

本篇BLOG和本系列的下一篇BLOG会对文件读写的步骤进行一一举例说明。

打开文件

file_object = open(file_name, access_mode='r', buffering=-1)
功能:打开一个文件,返回一个文件对象。
参数:file_name————文件名;
     access_mode————打开文件的方式,如果不写默认为‘r’ 
          文件模式                        操作
              r                    以读方式打开.文件必须存在
              w                    以写方式打开文件.若文件不存在,则创建,若存在,则清空原有内容 
              a                    以追加模式打开.若文件不存在,则创建,若存在,也保留文件内容,并在文件末尾继续写 

              r+                   以读写模式打开 文件必须存在
              w+                   以读写模式打开文件不存在则创建,存在清空原有内容
              a+                   以读写模式打开 追加模式
              rb                   以二进制读模式打开 同r
              wb                   以二进制写模式打开 同w
              ab                   以二进制追加模式打开 同a
              rb+                  以二进制读写模式打开 同r+
              wb+                  以二进制读写模式打开 同w+
              ab+                  以二进制读写模式打开 同a+
     buffering————参数0表示无缓冲,1表示有行缓冲,如果是大于1表示直接指明缓冲区大小。如果不写或为负数则表示使用系统默认提供的缓冲机制。在py中,通常情况下这个参数我们都不写,直接用系统默认的就OK了.
返回值:成功返回文件流对象。失败得到IOError。      

我们用open()打开一个文件,会返回给变量fd一个文件对象。打开一个文件之后,我们就可以对这个文件对象进行读写操作了。

备注:buffering表示,开辟的缓冲区类型。缓冲,表示系统自动的在内存中为每一个正在使用的文件开辟一个缓冲区,从内存向磁盘输出数据必须先送到内存缓冲区,装满缓冲区在一起送到磁盘中去。这样做,是为了减少与磁盘的交互次数,从而提高效率、保护了磁盘。举个例子:我们在用word写论文时,写了好几页,但没保存(假设word也没有帮我们自动保存),这些没保存的论文,就在缓冲区内。如果这时突然断电(假设我们此时用的是台式电脑)那么写了那么久的论文就会丢失。

图示:

网络编程(part2)--文件读写之打开/读取/写入

举个例子1(以读方式打开)

我们在主py文件test02.py所在的文件夹内创建一个txt文件,里面写一些数据,如下图所示:

网络编程(part2)--文件读写之打开/读取/写入

我们在主py文件中读取文件:

网络编程(part2)--文件读写之打开/读取/写入

结果:

网络编程(part2)--文件读写之打开/读取/写入

备注:别忘了最后一定要关闭文件!

网络编程(part2)--文件读写之打开/读取/写入

举个例子2(以写方式打开)

(1)若文件不存在

首先,我们看一下我们的文件列表:

网络编程(part2)--文件读写之打开/读取/写入

在python中,我们打开一个不存在的文件None.txt:

网络编程(part2)--文件读写之打开/读取/写入

我们再看一下,文件列表:

网络编程(part2)--文件读写之打开/读取/写入

新的文件创建出来了!

(2)文件存在, 且文件有内容

网络编程(part2)--文件读写之打开/读取/写入

查看一下我们的note.txt文件,结果:

网络编程(part2)--文件读写之打开/读取/写入

清空了!

读取文件

read

read([size])      

用来直接读取字节到字符串中,最多读取给定数目个字节。如果没有给定size参数(默认值为-1)或者size值为负,文件将被读取直至末尾。文件过大时候,不建议直接读取到文件末尾,因为会消耗大量内存,读取时间也会更长,建议在non-blocking模式下使用。

举个例子1

首先看一下我们的数据文件:

网络编程(part2)--文件读写之打开/读取/写入

(1) 不设置size参数,直接读取到文件末尾

我们读取一下:

网络编程(part2)--文件读写之打开/读取/写入

输出结果:

网络编程(part2)--文件读写之打开/读取/写入

(2)一次读取16个字节

①我们按照一次16个字节读取文件:

网络编程(part2)--文件读写之打开/读取/写入

输出结果:

网络编程(part2)--文件读写之打开/读取/写入

②我们按照一次1024个字节读取文件:

网络编程(part2)--文件读写之打开/读取/写入

输出结果:

网络编程(part2)--文件读写之打开/读取/写入

若一次想要读取的字节数,大于文件的字节数,则文件有多少字节,就读取多少字节。

(3)一次读取8个字节,但仍然想读完全部文件

循环读取:

网络编程(part2)--文件读写之打开/读取/写入

结果:

网络编程(part2)--文件读写之打开/读取/写入

readline

readline([size])      

读取打开文件的一行(读取下个行结束符之前的所有字节)。没有给定size参数,则读取整行整行,包括行结束符,并作为字符串返回。和 read() 相同,它也有一个可选的 size 参数,默认为 -1,代表读至行结束符。如果提供了该参数,如果行的字节数超过size,则会返回不完整的行。

举个例子2(继续用例子1的note.txt文件)

(1)不设置size参数,读取一行

我们读取一下:

网络编程(part2)--文件读写之打开/读取/写入

结果:

网络编程(part2)--文件读写之打开/读取/写入

备注:当我们没有指定size时,readline遇到换行符才会结束。

(1)设置size参数

①我们按照一次4个字节读取行:

网络编程(part2)--文件读写之打开/读取/写入

结果:

网络编程(part2)--文件读写之打开/读取/写入

我们再读取一次:

网络编程(part2)--文件读写之打开/读取/写入

结果:

网络编程(part2)--文件读写之打开/读取/写入

由结果可知,第二次读取时,readline会沿着第一次读取的末尾,继续读取这一行剩下内容。

readlines

readlines([sizeint])      

该方法并不像其它两个输入方法一样返回一个字符串。它会读取所有(剩余的)行然后把它们作为一个字符串列表返回。它的可选参数sizhint代表返回的最大字节大小,当sizeint不足该行的字节数时,也会得到这一行的内容。我们在使用时,一般不设置参数。

举个例子3

读取:

网络编程(part2)--文件读写之打开/读取/写入

结果:

网络编程(part2)--文件读写之打开/读取/写入

由结果可知,每一行,读取成了列表中的一个元素。

for循环

for line in fd:
     print(line)      

文件对象本身也是一个可迭代对象,在for循环中可以迭代文件的每一行。

举个例子4

读取:

网络编程(part2)--文件读写之打开/读取/写入

结果:

网络编程(part2)--文件读写之打开/读取/写入

写入文件

write

write(string)      

功能与 read() 和 readline() 相反。它把含有文本数据或二进制数据块的字符串写入到文件中去。

举个例子1

我们向空文件None.txt写入数据:

网络编程(part2)--文件读写之打开/读取/写入

结果:

网络编程(part2)--文件读写之打开/读取/写入

再写一行:

网络编程(part2)--文件读写之打开/读取/写入

结果:

网络编程(part2)--文件读写之打开/读取/写入

备注:如果想换行就要人为添加换行符\n。

writelines

writelines(str_list)      

和 readlines() 相反,writelines()方法是针对列表的操作,它接受一个字符串列表作为参数,将它们写入文件。行结束符并不会被自动加入,所以如果需要的话,你必须在调用writelines()前给每行结尾加上行结束符。

举个例子2

我们None.txt写入数据:

网络编程(part2)--文件读写之打开/读取/写入

结果:

网络编程(part2)--文件读写之打开/读取/写入

举个例子3(以追加模式写入)

原来的note.txt文件:

网络编程(part2)--文件读写之打开/读取/写入

写入:

网络编程(part2)--文件读写之打开/读取/写入

结果:

网络编程(part2)--文件读写之打开/读取/写入

备注:在追加模式a下,不能read()操作,因为它没有读取得权限。如果读取,则会报错。

如下所示:

网络编程(part2)--文件读写之打开/读取/写入

结果:

网络编程(part2)--文件读写之打开/读取/写入