文件的操作
- 打开文件 2.对文件句柄进行操作 3.关闭文件。
open() 有三个参数:1. 文件路径 (文件夹路径+文件名+文件类型) 2. 编码方式(encoding)3. 模式(mode)
fl = open('d:python.txt',encoding='utf-8',mode='r') #d:python.txt是我d盘下的一个名为python的TXT文件,我写这个文件时时用sublime软件写的,以utf-8编码格式保存的,所以encoding参数是utf-8。
content = fl.read()
print(content)
fl.close #每次操作文件后一定要关闭
>>>i love python
open:内置函数,open底层调用的是操作系统的接口。
fl:变量,一般在文件操作时设置的约定俗成的变量,也有写作为f1,fh,file_handler,f_h等,也被称为文件句柄(但它只是一个约定俗成的变量,自己可以随意更改,但最好不要改)。通过对文件进行的任何操作都需要用:文件句柄.(fl.raed()等)的方法。
encoding:可以不写,不写参数会以操作系统默认的编码本打开(windows默认编码:gbk(windows10是utf-8,Linux:utf-8,mac:utf-8),但最好写上,内存中全是Unicode编码,而内存中的文件则不是(详细介绍请看python基础学习day7)
mode:可以默认不写,默认不写则以只读(r)的方式打开
常见报错原因:
-
UnicodeDecodeError:文件储存时与文件打开时编码本不一致。
-
路径分隔符产生问题: (反斜杠) 有转义符的意思,如 、 、u等,若果文件放在c盘中则有可能报错。如下:
fl = open('C:Usersa1566Desktoppython.txt',encoding='utf-8',mode='r') content = fl.read() print(content) >>>SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated UXXXXXXXX escape #解决方法:在文件路径前加r,让转义符失效 fl = open(r'C:Usersa1566Desktoppython.txt',encoding='utf-8',mode='r') content = fl.read() print(content) >>>i love python
-
文件的读取:
-
r , rb , r+, r+b.
-
read() 若括号中无参数则一次全部读出,若写参数(数字)则可以按照字符(从1开始)读取,文件中的换行符算作一个字符。
fl = open(r'd:python.txt',encoding='utf-8',mode='r') content = fl.read() print(content) fl.close() >>>i love python content = fl.read(5) print(content) >>>i lov
-
readline() 若括号中无参数则读一行,若写参数(数字)则可以按照字符(从1开始)读取字符(同read),文件中的换行符算作一个字符。注意,文本中有换行符,而print()函数也默认换行。
fl = open(r'd:python.txt',encoding='utf-8',mode='r') content = fl.readline() print(content) #可更改print的默认输出结构以取消print函数默认输出的换行符:print(content,end='') >>>i love python. #换行符也被读出来了
-
readlines() 若括号中无参数读取所有行,返回列表,列表的每个元素为源文件的每一行,若写参数(数字)则可以按照每一行读取。
fl = open(r'd:python.txt',encoding='utf-8',mode='r') content = fl.readlines() print(content,end='') fl.close() >>>['i love python. ', 'i love you too.']
-
循环读取,文件句柄可遍历(文件句柄是一个迭代器,每次for循环时都只读取文件一行,节省内存,而read,readlines等是一次读取至内存中,若果文件过大,则会出现问题)。
f = open(r'd:python.txt',encoding='utf-8') for line in f: print(line) f.close() >>>i love python. i love you too.
-
rb:操作的是非文本的文件,比如:图片,视频,音频等。rb模式不用encoding
fl = open(r'd:雪景.jpg',mode='rb') #雪景.jpg是张照片 print(fl.read()) >>> #字节太多,请自测
-
r+ 读写功能(读并追加),推荐先读后写
f = open(r'd:python.txt',encoding='utf-8',mode='r+') f.read() f.write('1234567') #先读后写 f.close()
- 文件的读取都有指针(光标)定位,文件中的指针起始位置在文件最前面。r+模式若先读后写,则写入的内容会在文件末尾,若用先写后读,则会从文件开头写入,写入一个字符就覆盖一个字符,直到写入完毕
- 先写后读会出现乱码问题,因为中文,英文,特殊字符等所占的字节不同,先写后读会以覆盖式写入,若写入得字符串与文件中的字符串所占的字节不同,则会出现乱码和报错。
-
-
文件的写:
-
四种模式:w ,wb, w+, w+b
-
w,wb: 若已有相同的文件则会先清空原有文件的内容再写入 ,若无则会创建。
- 清空:打开文件后会先清空原文件再写入,但是如果文件句柄没有关闭,则可以循环写入而不会被清空。关闭文件句柄再次以’w‘模式打开原文件时才会清空
f = open('d:/text.txt',encoding='utf-8',mode='w') #可在当前目录下创建有一个名为text的TXT类型的文件,若已有文件则会先清空文件内容再写入 f.write('i love python') f.close()
-
-
文件的追加:
-
a ,ab ,a+ ,a+b
-
a:若无文件则会创建文件。若有则直接在原文件后追加
f = open('d:/text.txt',encoding='utf-8',mode='a') f.write(' i love you too') f.close()
-
-
tell() 读取指针(光标)的位子,以字节为单位(utf-8编码:一个中文三个字节,一个字母1个字节,详情请看day2)
fl = open(r'd:python.txt',encoding='utf-8') print(f1.tell()) >>>0 content = fl.read() print(fl.tell) >>>25 fl.close()
-
seek() 调整光标的位置,以字节为单位 ,调整到文件的开头:seek(0), 调整到文件的末尾:seek(0,2).
fl = open(r'd:python.txt',encoding='utf-8') print(f1.seek(8))
-
flush() 强制刷新(保存),一般在写文件时使用,在写后一般要对文件句柄使用flush方法,以免保存失败。
f = open(r'd: ext.txt',encoding='utf-8',mode='w') f.write(' i love you too') f.flush() f.close()
-
打开文件的另一种方式(推荐)
- with open() as :
- 优点:不用手动关闭文件句柄,会在一定时间内关闭;一个with可以操作多个文件。
- 缺点:
with open(r'd: ext.txt',encoding='utf-8',mode='a') as f: f.write(' i love you too') #打开多个文件: with open(r'd: ext.txt',encoding='utf-8',mode='a') as f1,open(r'd:python.txt',encoding='utf-8',mode='a') as f2: #第二个open后的反斜杠为换行符,换行符后不加任何字符,当一行的代码太长时可以使用 f1.write(' i love you too') f2.read()
- with open() as :
-
文件的修改操作:
-
各大操作文件的软件(word、笔记本等等)底层都以以下基本方式操作文件:
- 1.以读的模式打开原文件
- 2.以写的模式创建一个新文件
- 3.将原文件的内容读出来修改成新的内容,写入新文件
- 4.将原文件删除 (python需要引入os模块)
- 5.将新文件重命名 (python需要引入os模块)
-
实列方法(将d盘下的python.txt文件中的小写o全变为大写,python文件中的内容如下:i love python./n i love you too. 文件内容简单,请自行创建即可)
import os #引入os模块 #1.以读的模式打开原文件 #2.以写的模式创建一个新文件 with open(r'd:python.txt',encoding='utf-8') as f1, open(r'd:python.bak',encoding='utf-8',mode='w') as f2: #.bak是一种备份文件类型 #3.将原文件的内容读出来修改成新的内容,写入新文件 old_content = fl.read() #读出来的为str类型 new_content = old_content.replace('o','O') f2.write(new_content) #4.将原文件删除 os.remove('d:python.txt') #5.将新文件重命名 os.rename('d:python.bak','d:python.txt')
以上方法(read)只能用于小文件,遇上大文件就会出现问题,因此可以对其进行更改,如下:
import os #引入os模块 #1.以读的模式打开原文件 #2.以写的模式创建一个新文件 with open(r'd:python.txt',encoding='utf-8') as f1, open(r'd:python.bak',encoding='utf-8',mode='w') as f2: #.bak是一种备份文件类型 #3.将原文件的内容读出来修改成新的内容,写入新文件 for old_line in f1: new_line = old_line.replace('o','O') f2.write(new_line) #4.将原文件删除 os.remove('d:python.txt') #5.将新文件重命名 os.rename('d:python.bak','d:python.txt')
-