Python基础-文件读写

烂漫一生 提交于 2020-08-12 08:36:37

读取文件

全部读取

新建一个a.txt文件,里面写入如下三行:

aaa
bbb
ccc

python自动导入了io模块,我们可以直接使用open函数来打开文件,得到文件对象,然后调用对象的read方法获取文件内容。

file = open("a.txt")
data = file.read()
file.close()
print(data)

打印结果:

aaa
bbb
ccc

 

通常,在程序退出时会自动关闭文件对象,但是有可能我们的程序运行时间长呢,也就占用了文件锁,并且写入文件的时候,文件内容会被放入缓冲区以提高效率,此时如果程序未运行完就报错了,那么写入的内容实际上是不会写入文件的。所以关闭文件没有坏处,应该要养成用完就关的习惯。

 

为了保证文件一定能关闭,程序员一般的做法是使用异常捕获的方式处理。而python给我们提供了便利的写法 :with上下文管理器

with open("a.txt") as file:
    data = file.read()
print(data)

 

注意一点,如果文件之中有中文,可能会出现文件是utf-8格式的情况,这种情况下read方法读取中文内容就会报错,需要打开文件的时候指定编码:

with open("a.txt",encoding='utf-8') as file:
    data = file.read()
print(data)

 

逐行读取

逐行读取有三种写法,第一种是文件迭代器,直接遍历打开的文件对象

with open("a.txt") as file:
    for line in file:
        print(line.rstrip())

打印结果:

aaa
bbb
ccc

进行rstrip过滤是因为每一行的末尾都隐藏的有回车换行。

 

第二种是使用readline方法每次读取一行

with open("a.txt") as file:
    while True:
        data = file.readline()
        if not data: break
        print(data.rstrip())

打印结果:

aaa
bbb
ccc

 

第三种用readlines方法将文件所有内容取出装入一个列表中,然后遍历列表

with open("a.txt") as file:
    lines = file.readlines()
for data in lines:
    print(data.rstrip())

打印结果:

aaa
bbb
ccc

 

写入文件

写入文件要在打开文件的时候提供第二个参数表明已什么方式打开,读取文件内容的时候是没有传入参数的,实际上是默认为读模式。

with open("b.txt",'w') as file:
    file.write('aaa')

 

参数常用有如下几种:

r:读模式
w:写模式
x:独占写模式
a:追加写模式 以这种模式打开文件后 指针会放到文件的末尾
b:二进制模式
+:读写模式 必须和其他模式搭配使用 如r+(指针在开头,先读后写)、a+(指针在末尾,可读追加写)、w+(指针在开头,覆盖写读)




 

需要介绍的是r+和w+的区别,都是读写,但不一样的是指针的位置

 

r+模式指针在文档开头,读一行指针走一行,如果读完之后再写入,指针就到了文件末尾,那么写入的内容就是追加的,如果先写入,那么就是覆盖的。

比如现在b.txt里面有4个字符:

abcd

 

那么我先写后读:

with open("b.txt",'r+') as file:
    file.write('x')
    file.write('y')
    file.seek(0)
    print(file.read())

打印结果:

xycd

可以看到,写入了两个字符,就是覆盖了前两个字符,后面的字符仍然没变。seek(0)是操作指针回到开头,要不然只会打印出后面的cd两个字符。

 

w+是全截断覆盖写,也就是把文档当做一个空白文档新写东西,无论文档里面有啥,读出来的都是空。

把b.txt的内容恢复成abcd四个字符。

with open("b.txt",'w+') as file:
    print(file.read())
    file.write('x')
    file.write('y')
    file.seek(0)
    print(file.read())

打印结果:


xy

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!