一、文件的打开和关闭 1.1 打开方式 1.2 文件的简单操作 1.3 打开文件的方式 二、按行读取文件的内容 演练:文件复制 open() #打开文件,并返回file对象 file.close() file.read() #一次性读取整个文件 file.readlines() #一次性读取,放到一个列表中 file.readline() #读取一行 file.write() file.tell() #返回文件当前的位置。 file.seek() 一、文件的打开和关闭 1.1 打开方式 方式一: file = open("文件路径", "打开模式", encoding="字符编码") ... file.colse() 方式二: with open("文件路径", "打开模式", encoding = "字符编码") as f: ... 使用第二种方式的好处是,执行完毕后,自动对文件进行close操作。 编码方式默认是gbk,如果中文还是读不出来,可以试试:utf-8, 1.2 文件简单读写操作 file = open("README") #如果文件存在,返回文件操作对象;如果不存在,抛出异常。 text = file.read() #一次性读入并返回文件中的所有内容。【例1】 file.close() #如果忘记关闭文件,会造成系统资源消耗,而且会影响到后续对文件的访问。 例1: ![](https://i-blog.csdnimg.cn/blog_migrate/d13ac988bb230dace9dba779a709708d.png) 结果: ![](https://i-blog.csdnimg.cn/blog_migrate/a0f2b5877b29e4ae400c5fb5fd60f70b.png) 补充:文件指针。当执行了read()之后,文件指针就指向文件末尾了。再read()就读不了了。【例2】 ![](https://i-blog.csdnimg.cn/blog_migrate/9f874c488202ef73dfe9e64979b105f7.png) 例2: ![](https://i-blog.csdnimg.cn/blog_migrate/49c0d0ed18b6455b80b9ef5dd421e4f8.png) 结果: ![](https://i-blog.csdnimg.cn/blog_migrate/0eae6cd8febb39727f91a40736d1b59c.png) 1.3 Python打开文件的方式 前面学了file = open("aaa.txt"),没有传递第二个参数。这时候Python会默认以只读方式打开文件。这时候就只能读,不能写入数据。 "r" #只读。如果文件不存在,会报错。 “w” #只写。如果文件不存在,会创建。写的时候会覆盖,每次都从头写。【例2】。注意每次打开是从头写,在一次打开的过程内还是一直往后写的。【例3】 “a” #追加写。如果文件不存在,会创建。写的时候会从文件尾继续写。【例4】 “x” #创建写。如果不存在就创建。如果存在就报错。 关于“r+”、“w+”、“a+”等 有个印象就好。 "r+" : ![](https://i-blog.csdnimg.cn/blog_migrate/201073fc656bd367ac1d5e4235f3bcfd.png) “w+” ![](https://i-blog.csdnimg.cn/blog_migrate/1b43cd0324cd6c5fd1e6183a518a53ab.png) "a+" ![](https://i-blog.csdnimg.cn/blog_migrate/ba1036625b85245fd2689cce3bc50591.png) ![](https://i-blog.csdnimg.cn/blog_migrate/a350bdbd3d08fdd3dfd580464126fc82.png) 例2: 首先看一下README中的内容: ![](https://i-blog.csdnimg.cn/blog_migrate/5df23ddd441cb8bff93544993d89106f.png) 然后编写test.py文件: ![](https://i-blog.csdnimg.cn/blog_migrate/dd326d9dc8d28725cbc3ba846c9e3d08.png) 执行后: ![](https://i-blog.csdnimg.cn/blog_migrate/0238fe5d5e9f4a9f12104ce6250263f8.png) 文件内容改变了。 例3: 首先看一下README中的内容: ![](https://i-blog.csdnimg.cn/blog_migrate/baa50218ea3d574901f55fa9b45b6d2f.png) 编写test.py: ![](https://i-blog.csdnimg.cn/blog_migrate/01beb8db162b9de92cf9bd70b6d04da9.png) 结果: ![](https://i-blog.csdnimg.cn/blog_migrate/463a6deb07b4fb85f33ebce02699867a.png) 例4: 首先看一下README中的内容: ![](https://i-blog.csdnimg.cn/blog_migrate/0238fe5d5e9f4a9f12104ce6250263f8.png) 然后编写test.py文件: ![](https://i-blog.csdnimg.cn/blog_migrate/15ef432a1c14c247b9a79951f85db0a1.png) 结果: ![](https://i-blog.csdnimg.cn/blog_migrate/6f933976d51771acacf8bac167606402.png) 二、文件读取操作详解 read() #一次性读取所有内容 readlines() #一次性读取,放到一个列表中。 readline() #读取一行内容 2.1 read() 前面介绍过,这里详细介绍一下。 text = read() 一次性读取所有内容,并赋给一个字符串变量。 text = read(5) 读入指定的字节数。 2.2 readlines() readlines() #一次性读取整个文件。每一行一个字符串,保存到一个列表中。 例: aaa/abc.txt 内容如下: ![](https://i-blog.csdnimg.cn/blog_migrate/634eb87752083c01fa8220acb289ed51.png) 读取: ![](https://i-blog.csdnimg.cn/blog_migrate/14ea13ad50df0b784f5d646f48650baf.png) 结果: ![](https://i-blog.csdnimg.cn/blog_migrate/672186f9187e1115c6bf02dac44f4f61.png) 2.3 readline() read()和readlines()方法一次性会把所有的内容都读出来。如果文件太大,内存可能不够。 readline()方法,一次可以读取一行内容。当执行了readline()后,文件指针会移动到下一行,这样就可以再次读取了。【例1】 readline()方法写起来有点麻烦。而我们打开的文件,本身就是可迭代对象,我们可以每次迭代读取一行内容。【例2】 ![](https://i-blog.csdnimg.cn/blog_migrate/f05e8d45c381bc17e1758feb56c18f20.png) 例1: README内容为 ![](https://i-blog.csdnimg.cn/blog_migrate/ccb3d38f7f5d57392101b302aea4c0c2.png) test.py ![](https://i-blog.csdnimg.cn/blog_migrate/25dd56bcfe9ed8bcafb5ef14d669fbab.png) 结果: ![](https://i-blog.csdnimg.cn/blog_migrate/fecf4435b0fa38ac61b2580fd97e269d.png) 如果不写end="",会再空一行。这是因为,读取的文件每一行的末尾本身有一个换行符。而print()语句如果不写end的话,默认有一个换行。所以会再空一行。 例2: ![](https://i-blog.csdnimg.cn/blog_migrate/31a75c2075e52ab1ae99974ff94965fb.png) 结果: ![](https://i-blog.csdnimg.cn/blog_migrate/09e583702ecdab831c5540d6655bba82.png) 三、文件写入操作详解 3.1 write() 将字符串写入到文件中。 例1:写之前文件为: ![](https://i-blog.csdnimg.cn/blog_migrate/b0a521eeae87dfe4b62c57ee22b8346b.png) 覆盖写: ![](https://i-blog.csdnimg.cn/blog_migrate/0cdd260ac58952df8dcb94c9068c6433.png) 结果: ![](https://i-blog.csdnimg.cn/blog_migrate/9e5d9d17732374ab3ba0d1239ad6f5ab.png) 3.2 writelines() 将列表中存储的字符串写入文件中。 例: ![](https://i-blog.csdnimg.cn/blog_migrate/cbd5dbfe883c22ea5b3ab8c572268eac.png) 结果: ![](https://i-blog.csdnimg.cn/blog_migrate/cd3bd7543b18524d34f02ae34e3b4f9d.png) 四、演练:文件拷贝 情况(1):如果文件较小,一次性可以读入 ![](https://i-blog.csdnimg.cn/blog_migrate/c22b80b1362d5a0b7abf6d1de593394b.png) 情况(2):如果文件较大,需要一行一行读入 ![](https://i-blog.csdnimg.cn/blog_migrate/3f172dee81a48816d250e84ea0bafb42.png) 其中,第二行 也可以写成“w”也没问题。因为后面的循环并没有关闭文件,所以写到哪里,文件指针就指在哪里,并不是从头开始写。 |