文本文件的读取
文件的读取一般使用如下三个方法:
- read([size])
从文件中读取size 个字符,并作为结果返回。如果没有size参数,则读取整个文件。读取到文件末尾,会返回空字符串。 - readline()
读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。 - readlines()
文本文件中,每一行作为一个字符串存入列表中,返回该列表
# 读取一个文件前3个字符
with open(r'c.txt', 'r', encoding='gbk') as f:
str = f.read(3) # 读取文件的前三个字符,英文中文都以一个字符记
str2 = f.read() # 从第四个字符起,读取整个文件
print(str)
print(str2)
# 按行读取一个文件
with open(r"c.txt", "r") as f:
while True: # 循环语句结构,逐行读取文件
fragment = f.readline()
if not fragment: # 读取到文件末尾,会返回空字符串。not 空字符串 = not false =ture
break
else:
print(fragment, end="")
# 使用迭代器(每次返回一行)读取文本文件
with open(r"c.txt", "r") as f:
for a in f:
print(a, end="")
# 为文本文件每一行的末尾增加行号
a = ['python\n', 'java\n', 'html\n'] # 文件读取后的存放格式
b = enumerate(a) # 对列表元素添加索引,并用元组打包
print(a)
print(b) # <enumerate object at 0x000001E80CDB3C78>,可迭代对象
print(list(b)) # [(0, 'python\n'), (1, 'java\n'), (2, 'html\n')],在列表中以元组形式(index,line)存放(索引值,行内容)
# 用文件代替a变量
with open("c.txt", "r", encoding="gbk") as f:
lines = f.readlines() # 读取文件,将每一行作为一个字符串存入列表中
lines = [line.rstrip() + " #" + str(index + 1) + "\n" for index, line in
enumerate(lines)] # 列表为可变类型变量,推导式生成新列表,str.rstrip()去除右边空白符
with open("c.txt", "w", encoding="gbk") as f:
f.writelines(lines) # w,覆盖原文件重写
二进制文件的读取和写入
二进制文件的处理流程和文本文件流程一致。首先要创建文件对象,不过需要指定二进制模式,从而创建出二进制文件对象。例如:
f = open(r"d:\a.txt", 'wb') # 可写的、重写模式的二进制文件对象
f = open(r"d:\a.txt", 'ab') # 可写的、追加模式的二进制文件对象
f = open(r"d:\a.txt", 'rb') # 可读的二进制文件对象
创建好二进制文件对象后,仍然可以使用write()、read()实现文件的读写操作。
# 读取图片文件,实现文件的拷贝
with open(r'photo.jpg', 'rb') as f:
with open(r'photo_copy.jpg', 'wb') as w:
for line in f.readlines():
w.write(line)
print('success copied')
文件对象的常用属性和方法
文件对象的常用属性
属性 | 说明 |
---|---|
name | 返回文件的名字 |
mode | 返回文件的打开模式 |
closed | 若文件被关闭则返回True |
文件对象的打开模式
模式 | 说明 |
---|---|
r | 读模式 |
w | 写模式 |
a | 追加模式 |
b | 二进制模式(可与其他模式组合) |
+ | 读写模式(可以其他模式组合) |
文件对象的常用方法
方法名 | 说明 |
---|---|
read([size]) | 从文件中读取size 个(二进制)字节或(文本)字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容 |
readline() | 从文本文件中读取一行内容 |
readlines() | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回 |
write(str) | 将字符串str 内容写入文件 |
writelines(s) | 将字符串列表s 写入文件文件,不添加换行符 |
seek(offset [,whence]) | 把文件指针移动到新的位置,offset 表示相对于初始位置whence 的多少个字节的偏移量;offset:为正往结束方向偏移,为负往开始方向偏移。whence :0: 从文件头为指针起始值(默认值);1:从当前位置为指针起始值;2:从文件尾为指针起始值 |
tell() | 返回文件指针的当前位置 |
truncate([size]) | 不论指针在什么位置,只留下指针前size 个字节的内容,其余全部删除;如果没有传入size,则当指针当前位置到文件末尾内容全部删除 |
flush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源 |
# 控制指针读取文件内容
with open(r'c.txt', 'r', encoding='gbk') as f:
print('文件名:{0}'.format(f.name))
print(f.tell()) # 返回当前指针位置
print('读取第一行内容:{0}'.format(f.readline()))
print(f.tell()) # 返回读取一行文本后的指针位置
f.seek(7) # 默认指针起始位置为文件开头,偏移三个字符,gbk编码中文占两个字符,英文占一个字符
print('读取偏移指针后到当前行尾的内容:{}'.format(f.readline()))