python中文件的读写与打开方式(详解)

公众号‘小鹏长翅’同步发布

文件的读写是我们经常用到的操作,常用的编程语言都会提供一个内置函数,通过输入'文件路径'和'文件打开模式'来打开一个文件对象。

我们来看下python中的文件读写操作

一、Python中的文件打开模式

打开模式 用法
r 以只读的方式打开文件,若文件不存在,会报错
r+ 可以同时读写,若文件不存在,会报错,写入时是覆盖写入
w 以只写的方式打开文件,若文件不存在则新建,写入时是清空写入
w+ 可以同时读写,若文件不存在则新建,写入时是清空写入
a 以只追加可写模式打开文件,若文件不存在则新建 ,写入时是追加写入
a+ 可以同时读写,若文件不存在则新建,写入时是追加写入

下面我们分别试一下这几种打开模式的用法(open)

我们先在D盘创建一个note1.txt文件

python中文件的读写与打开方式(详解)

r 只读

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'

r+ 读写--覆盖写入

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 只写

只写‘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,确实清空了之前的内容

python中文件的读写与打开方式(详解)

只写‘w’方式打开不存在的文件,会新建文件并写入内容

filepath = r'D:\note_new.txt'#不存在的文件
file1 = open(filepath,'w',encoding='utf-8')#通过只写(w)的方式打开文件
file1.write('这是个新文件')
file1.close()

然后去我们的D盘查看,确实多了一个note_new.txt的文件

python中文件的读写与打开方式(详解)

w+ 读写--清空写入

'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 只写--追加写入

我们经常会有这样的需求,在写入内容时不想删除之前的内容。

打开模式'a'就可以满足。

与打开模式'w'唯一的区别就是写入方式为'追加写入'

也可以理解为比'w'方式多了一个'把光标移到末尾'的操作

filepath = r'D:\note1.txt'
file1 = open(filepath,'a',encoding='utf-8')#通过追加写'a'的方式打开文件
file1.write('欢迎交流')#追加写入内容
file1.close()

然后我们看下note1.txt

确实以追加的方式写入了内容

python中文件的读写与打开方式(详解)

a+ 读写--追加写入

'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

为了避免忘记或者为了避免每次都要手动关闭文件,我们可以使用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盘也多了两个文件,且内容也是我们写入的内容

python中文件的读写与打开方式(详解)python中文件的读写与打开方式(详解)python中文件的读写与打开方式(详解)

三、文件读取相关方法

方法 作用
read() 读取文件全部内容,返回值是字符串
readline() 读取一行的内容,返回值是字符串
readlines() 逐行读取文件所有内容,返回值是列表
read().splitlines() 读取文件全部内容,返回值是列表,不出现
下面我们分别试下这几种方法

先建一个new_file.txt,内容如下

python中文件的读写与打开方式(详解)

  • read()
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个字符
>>>
好好学
  • readline()
filepath = r'D:\new_file.txt'
with open(filepath,encoding='utf-8') as file:#打开文件
    print(file.readline())#读取一行内容,返回字符串
>>>
好好学习
  • readlines()
filepath = r'D:\new_file.txt'
with open(filepath,encoding='utf-8') as file:
    print(file.readlines())#读取一行内容,返回列表
>>>
['好好学习\n', '天天向上\n', '欢迎交流\n', '一起进步']
  • read().splitlines()

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())#读取全部内容,返回列表,不包括换行符
>>>
['好好学习', '天天向上', '欢迎交流', '一起进步']

上一篇:linux常用命令~文本处理


下一篇:Shell中if 条件判断总结