随笔- 71  文章- 17  评论- 0  阅读- 5321 

文件内光标的移动

  • 文本模式下read()括号内的数字表示读取几个字符
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read(3)
print(data)
  • 二进制模式下read()括号内的数字表示读取及格字节(英文1字节,中文3字节)
with open(r'a.txt', 'rb') as f:
data = f.read(3)
print(data.decode('utf8'))

tell方法

  • .tell():获取光标移动的字节数

seek方法

  • 之前文件内指针的移动都是由读/写操作而被动触发的,若想读取文件某一特定位置的数据,则需要用seek方法主动控制文件内指针的移动
  • .seek(offset,whence)
    • offset:指针移动的字节数
    • whence:模式控制
      • 0模式(默认模式):基于文件开头移动的多少字节
      • 1模式:基于光标当前所在位置移动多少字节(只能在二进制模式(b模式)下使用)
      • 2模式:基于文件末尾移动多少字节(只能在二进制模式(b模式)下使用)

0模式详解

# a.txt用utf-8编码,内容如下(abc各占1个字节,中文“你好”各占3个字节)
abc你好
# 0模式的使用
with open('a.txt',mode='rt',encoding='utf-8') as f:
f.seek(3,0) # 参照文件开头移动了3个字节
print(f.tell()) # 查看当前文件指针距离文件开头的位置,输出结果为3
print(f.read()) # 从第3个字节的位置读到文件末尾,输出结果为:你好
# 注意:由于在t模式下,会将读取的内容自动解码,所以必须保证读取的内容是一个完整中文数据,否则解码失败
with open('a.txt',mode='rb') as f:
f.seek(6,0)
print(f.read().decode('utf-8')) #输出结果为: 好

1模式详解

# 1模式的使用
with open('a.txt',mode='rb') as f:
f.seek(3,1) # 从当前位置往后移动3个字节,而此时的当前位置就是文件开头
print(f.tell()) # 输出结果为:3
f.seek(4,1) # 从当前位置往后移动4个字节,而此时的当前位置为3
print(f.tell()) # 输出结果为:7

2模式详解

# a.txt用utf-8编码,内容如下(abc各占1个字节,中文“你好”各占3个字节)
abc你好
# 2模式的使用
with open('a.txt',mode='rb') as f:
f.seek(0,2) # 参照文件末尾移动0个字节, 即直接跳到文件末尾
print(f.tell()) # 输出结果为:9
f.seek(-3,2) # 参照文件末尾往前移动了3个字节
print(f.read().decode('utf-8')) # 输出结果为:好
# 小练习:实现动态查看最新一条日志的效果
import time
with open('access.log',mode='rb') as f:
f.seek(0,2)
while True:
line=f.readline()
if len(line) == 0:
# 没有内容
time.sleep(0.5)
else:
print(line.decode('utf-8'),end='')

文件内数据修改

  • 机械硬盘存储数据的原理:
    • 数据的覆盖(覆盖写)
    • 数据的删除(占有态自有态)

修改文件的方式

  • 文件对应的是硬盘空间,硬盘不能修改对应的文件本质也不能修改。

1.覆盖写

  • 实现思路:先读取文件的内容一次性全部读入到内存,在内存中完成修改再覆盖写回原文件
  • 优点:硬盘只占用一块空间
  • 缺点:数据量较大的时候会造成内存溢出
with open(r'demo.txt','r',encoding='utf8') as f:
data = f.read()
new_data = data.replace('DSB','NB')
with open(r'demo.txt','w',encoding='utf8') as f1:
f1.write(new_data)

2.重命名

  • 实现思路:先读取文件内容到内存,在内存中完成修改,之后保存到另一个文件中再将原文件删除,将新的文件重命名为原文件
  • 优点:不会占用过多的内存(不会造成内存溢出)
  • 缺点:在文件修改过程中同一份数据存了两份,也可能是在内存中创建没有刷到硬盘
import os
with open('demo.txt', 'r', encoding='utf8') as read_f, \
open('.demo.txt.swap', 'w', encoding='utf8') as wrife_f:
for line in read_f:
wrife_f.write(line.replace('NB', 'SB'))
os.remove('demo.txt') # 删除文件
os.rename('.demo.txt.swap', 'demo.txt') # 重命名文件

函数简介

  • 概念:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
  • 自定义统计方法:
    • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
    • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
    • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
    • 函数内容以冒号起始,并且缩进。
    • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
  • 自定义统计缺陷:
    1.只能统计某个固定的数据类型里面的数据值个数
    2.没有产生新的值(返回值)
l1 = [1, 2, 3, 4, 5, 6]
# print(len(l1)) # 不允许使用len 完成列表数据值个数统计
# 自定义统计方法
def my_len():
value_count = 0
for i in l1:
value_count += 1
print(value_count)
print(len(l1))
print(my_len())
 posted on   念白SAMA  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示