首页 python基础教程 Python文件读写操作深入讲解
pay pay

Python文件读写操作深入讲解

日期: 2021年12月1日 18:39
栏目: python基础教程
阅读: 54
作者: python自学网

摘要: 前面大家了解python是怎么操作文件的了,也学习过文件读取和写入模式的一些细节以及文件定位等等,这节课主要是深入了解文件读写的细节控制,容错方法和关闭文件的细节,另外还有一种简写方法with语句来操作文件读写。

前面大家了解python是怎么操作文件的了,也学习过文件读取和写入模式的一些细节以及文件定位等等,这节课主要是深入了解文件读写的细节控制,容错方法和关闭文件的细节,另外还有一种简写方法with语句来操作文件读写。下面来一一讲解。

1.文件读取:单行读取,多行读取和按字节读取,控制读取内容量

f = open('a.txt', 'r')
content = f.read(3)  # 3表示读取3个字节,同时下标会向右移动三个字节
content = f.readline()  # 表示读取一行,每次读取后指针移动一行
content = f.readlines()  # 把文件按照换行符进行读取,返回一个列表
print(content)
f.close()

2.文件对象遍历

这里要理解一个概念,文件读取后存放在一个对象f中,这个f对象是可迭代的对象,可以借助以下方法来验证一下,然后在对文件对象进行遍历。

f = open('files/123.jpg', 'r')
print(f)
print(type(f))
import collections.abc
print(isinstance(f, collections.abc.Iterator))  # 由此可见f也属于迭代器
for i in f:
    print(i, end='')
if f.readable():  # 通过readable()函数做一个容错处理
    content = f.readlines()
    for i in content:
        print(i, end='')

f.close()

注意:一般情况下文件不是很大使用read()和readlines()方法直接读取整个文件,readline()是一行一行的读取,适合处理较大文件,f是一个迭代器,使用for循环遍历也可以处理大文件。

3.文件写入操作

f = open('files/a.txt', 'a')
if f.writable():  # 容错
    print(f.write('aaa'))  # 返回结果是写入字符的长度,不是文件中字符的长度
f.close()

4.关闭文件操作:文件关闭后会自动释放资源,其次还会立即清空缓冲区的数据内容到磁盘文件,否则可能会导致文件内容的丢失,使用断点验证

f.flush()  # 通过这个方法也可以清空缓冲区文件,执行磁盘写入
# 刷新缓冲区的三种情况:1.关闭文件时自动刷新;2.手动调用flush函数刷新;3.缓冲区已满会自动刷新
f = open('files/abcd.txt', 'w')
f.write('aaa')  # 到这里内容还不能写入文件,只有刷新缓冲区或关闭后才能写入
f.flush()

5.with简写:使用with语句,不用关闭和属性操作,with语句中已经从底层帮为你解决了这个问题

with open('files/abc.txt', 'w') as f:
    f.write('aaaaaa')

6.编码和解码

with open('files/abc.txt', 'wb', encoding='utf-8') as f:
    str = 'aaaaaaaaaaaaaaaaaaaa'
    f.write(str)
with open('files/abc.txt', 'wb') as f:
    str = 'aaaaaaaaaaaaaaaaaaaa'
    f.write(str.encode('utf-8'))
with open('files/abc.txt', 'rb') as f:
    data = f.read()
    print(data)
    print(type(data))  # 字节类型数据,想使用转为字符串
    new_data = data.decode('utf-8')  # 编码和解码类型应该一致,否则会报错,特别是有中文字符时
    print(new_data)
    print(type(new_data))
with open('files/abc.txt', 'rb', errors='ignore') as f:  # errors='ignore'表示忽略编码错误
    pass

 

回顶部