公众号‘小鹏长翅’同步发布
文件的读写是我们经常用到的操作,常用的编程语言都会提供一个内置函数,通过输入'文件路径'和'文件打开模式'来打开一个文件对象。
我们来看下python中的文件读写操作
打开模式 | 用法 |
---|---|
r | 以只读的方式打开文件,若文件不存在,会报错 |
r+ | 可以同时读写,若文件不存在,会报错,写入时是覆盖写入 |
w | 以只写的方式打开文件,若文件不存在则新建,写入时是清空写入 |
w+ | 可以同时读写,若文件不存在则新建,写入时是清空写入 |
a | 以只追加可写模式打开文件,若文件不存在则新建 ,写入时是追加写入 |
a+ | 可以同时读写,若文件不存在则新建,写入时是追加写入 |
下面我们分别试一下这几种打开模式的用法(open)
我们先在D盘创建一个note1.txt文件
filepath = r'D:\note1.txt'#找到文件的路径 file1 = open(filepath,'r',encoding='utf-8') print(file1.read())#read()函数--读取全部内容,后有详解 #通过只读'r'的方式打开文件 #因为文件里是中文,所以我们指定编码方式为‘utf-8’ #'r'是open函数中‘打开方式’的缺省值,可以省略 file1.close()#关闭文件 使用open()时,必须要有close(),否则会一直占用内存 >>> 好好学习 天天向上
用只读'r'打开一个不存在的文件'note2.txt',则会报错
filepath = r'D:\note2.txt'#一个不存在的文件 file1 = open(filepath,'r',encoding='utf-8')#通过读'r'的方式打开文件 print(file1.read()) file1.close()#关闭文件 使用open()时,必须要有close(),否则会一直占用内存 >>>报错 FileNotFoundError: [Errno 2] No such file or directory: 'D:\\note2.txt'
filepath = r'D:\note1.txt' file1 = open(filepath,'r+',encoding='utf-8')#通过'r+'的方式打开文件 file1.write('欢迎交流')#以覆盖写入的方式写入'欢迎交流' file1.seek(0)#seek(n):光标回到文件首位,之后偏移n位 print(file1.read()) file1.close() >>> 欢迎交流#可以发现,'欢迎交流'覆盖了'好好学习' 天天向上
需要注意的是我们这块用到了一个seek(n)函数,这是因为我们写入内容后,光标位置在刚写入内容的后边,而读取文件内容时,是从光标的位置开始往后读,这时候就需要移动下光标位置以能获取文件全部内容。
我们看下上边例子中,不使用seek移动光标,输出的内容。
filepath = r'D:\note1.txt' file1 = open(filepath,'r+',encoding='utf-8') file1.write('欢迎交流')#写入之后,光标停在'流'字后边 #file1.seek(0)#seek(n): print(file1.read()) file1.close() >>> 天天向上#只会读取出光标后边的内容
用'r+'打开一个不存在的文件'note2.txt',同样会报错
filepath = r'D:\note2.txt'#一个不存在的文件 file1 = open(filepath,'r+',encoding='utf-8')#通过'r+'的方式打开文件 print(file1.read()) file1.close() >>>报错 FileNotFoundError: [Errno 2] No such file or directory: 'D:\\note2.txt'
只写‘w’方式,想读取文件内容,会报错
filepath = r'D:\note1.txt' file1 = open(filepath,'w',encoding='utf-8')#通过只写'w'的方式打开文件 print(file1.read())#读取文件内容 file1.close() >>>报错 io.UnsupportedOperation: not readable
在已存在的文件中进行写入
会清空文件中之前的内容
filepath = r'D:\note1.txt' file1 = open(filepath,'w',encoding='utf-8')#通过只写'w'的方式打开文件 file1.write('欢迎交流') file1.close()
然后我们看下note1.txt,确实清空了之前的内容
只写‘w’方式打开不存在的文件,会新建文件并写入内容
filepath = r'D:\note_new.txt'#不存在的文件 file1 = open(filepath,'w',encoding='utf-8')#通过只写(w)的方式打开文件 file1.write('这是个新文件') file1.close()
然后去我们的D盘查看,确实多了一个note_new.txt的文件
'w+'比'w'模式多了同时读写的功能,其他完全一样。
filepath = r'D:\note_new.txt'#不存在的文件 file1 = open(filepath,'w+',encoding='utf-8')#通过'w+'的方式打开文件 file1.write('这是个新文件') file1.seek(0)#光标回到首位 print(file1.read()) file1.close() >>>> 这是个新文件
我们经常会有这样的需求,在写入内容时不想删除之前的内容。
打开模式'a'就可以满足。
与打开模式'w'唯一的区别就是写入方式为'追加写入'
也可以理解为比'w'方式多了一个'把光标移到末尾'的操作
filepath = r'D:\note1.txt' file1 = open(filepath,'a',encoding='utf-8')#通过追加写'a'的方式打开文件 file1.write('欢迎交流')#追加写入内容 file1.close()
然后我们看下note1.txt
确实以追加的方式写入了内容
'a+'比'a'模式多了同时读写的功能,其他完全一样。
filepath = r'D:\note1.txt' file1 = open(filepath,'a+',encoding='utf-8')#通过'a+'的方式打开文件 file1.write('\n一起进步')#追加写入内容 file1.seek(0)#把光标移到首位 print(file1.read()) file1.close() >>> 好好学习 天天向上 欢迎交流 一起进步
为了避免忘记或者为了避免每次都要手动关闭文件,我们可以使用with语句
用法与open()一样
优点:
1)它可以处理多个文件
2)不需要写close()方法
filepath1 = r'D:\newfile1.txt' filepath2 = r'D:\newfile2.txt' with open(filepath1,'w+') as file1,open(filepath2,'w+') as file2: #同时打开两个新建文件 file1.write('good good study')#文件1写入内容 file2.write('day day up')#文件2写入内容 file1.seek(0)#文件1光标移到首位 file2.seek(0)#文件2光标移到首位 print(file1.read()) print(file2.read()) >>> good good study day day up
此时D盘也多了两个文件,且内容也是我们写入的内容
方法 | 作用 |
---|---|
read() | 读取文件全部内容,返回值是字符串 |
readline() | 读取一行的内容,返回值是字符串 |
readlines() | 逐行读取文件所有内容,返回值是列表 |
read().splitlines() | 读取文件全部内容,返回值是列表,不出现 |
先建一个new_file.txt,内容如下
filepath = r'D:\new_file.txt' with open(filepath,encoding='utf-8') as file:#打开文件 print(file.read())使用read()读取全部内容 >>> 好好学习 天天向上 欢迎交流 一起进步
read()也可以填一个参数,用来读取指定长度的内容
filepath = r'D:\new_file.txt' with open(filepath,encoding='utf-8') as file:#打开文件 print(file.read(3))#获取3个字符 >>> 好好学
filepath = r'D:\new_file.txt' with open(filepath,encoding='utf-8') as file:#打开文件 print(file.readline())#读取一行内容,返回字符串 >>> 好好学习
filepath = r'D:\new_file.txt' with open(filepath,encoding='utf-8') as file: print(file.readlines())#读取一行内容,返回列表 >>> ['好好学习\n', '天天向上\n', '欢迎交流\n', '一起进步']
splitlines() 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False(默认为False),不包含换行符,如果为 True,则保留换行符
filepath = r'D:\new_file.txt' with open(filepath,encoding='utf-8') as file: print(file.read().splitlines())#读取全部内容,返回列表,不包括换行符 >>> ['好好学习', '天天向上', '欢迎交流', '一起进步']