本章内容

  • 文件内光标的移动
  • 文件数据修改
  • 函数简介
  • 函数的语法结构

文件内光标的移动

# 1. 文件内容的读取,光标移动 eg:
    with open(r'1.txt','r',encoding='utf8') as f:
        print(f.read(3))
        print(f.read(3))
# 在文本模式下,括号内的数字表示的是读取指定的字符个数
"""
如下图所示:
	绿色的箭头表示第一个print输出后光标所在的位置
	红色的箭头表示第二个print输出后光标所在的位置
"""

python 光标多行 python文件光标_python 光标多行

python 光标多行 python文件光标_函数体_02

# 在二进制模式下,read括号内的数字表示的是读取指定的字节数
eg:
    with open(r'1.txt', 'rb') as f:
    print(f.read(9).decode('utf8'))
    print(f.read(3).decode('utf8'))

python 光标多行 python文件光标_函数体_03

# unicode 中所有的字符都是用2bytes来起步表示
# utf8中,中文用3bytes来表示 英文用1bytes来表示

# 2. 控制光标的移动
    with open(r'1.txt', 'r',encoding='utf8') as f:
        print(f.read(2))
        f.seek(3, 0)
        print(f.read(2))

python 光标多行 python文件光标_函数体_04

# 错误示例

python 光标多行 python文件光标_临时文件_05

# with open(r'a.txt', 'rb') as f:
    #     print(f.read(3).decode('utf8'))
    #     # f.seek(3, 1)  # 基于当前位置 继续往后移动三个字节
    #     f.seek(-3, 2)  # 基于文件末尾 往前移动三个字节
    #     print(f.tell())  # 获取光标基于文件开头的字节数
    #     print(f.read().decode('utf8'))
"""记得文本文件用b模式的时候要注意文本内容的末尾是否有空格和空行,不然可能查找不到"""
# 正确示例:

python 光标多行 python文件光标_函数体_06

python 光标多行 python文件光标_字节数_07

# 错误示例:

python 光标多行 python文件光标_函数体_08

python 光标多行 python文件光标_python 光标多行_09

"""
	seek方法可以控制光标的移动 在文本模式下移动的单位也是字节数
    	模板:    seek(offset,whence)
    		offset (控制偏移的字节数)
    		whence (控制模式(0, 1, 2))
    	0: 相对于文件开头(让光标先移动到文件开头)
                支持文本模式和二进制模式
        1:相对于当前位置(让光标先停留在当前位置)
                只支持二进制模式
        2:相对于文件结尾(让光标先移动到文件末尾)
                只支持二进制模式
    """

实际应用

# 实时检测文件内是否有新增的内容并打印出来
with open('access.log', mode='rb') as f:
        f.seek(0, 2)
        while True:
            line = f.readline()
            if len(line) == 0:
                # 没有内容
                pass
            else:
                print(line.decode('utf-8'), end='')

文件数据修改

"""
文件数据在硬盘上其实是刻死 不可能从中间再添加新的内容
只能将老内容移除 刻新的
"""

文件修改方式一:

# 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
# 优点: 在文件修改过程中同一份数据只有一份
# 缺点: 会过多地占用内存
eg:
    with open('a.txt', mode='rt', encoding='utf-8') as f:
    	data = f.read()
	with open('a.txt', mode='wt', encoding='utf-8') as f:
    	f.write(data.replace('张一蛋', 'SB'))

python 光标多行 python文件光标_函数体_10

python 光标多行 python文件光标_函数体_11

文件修改方式二:

# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份

python 光标多行 python文件光标_临时文件_12

函数简介

函数的使用必须遵循’先定义,后调用’的原则。函数的定义就相当于事先将函数体代码保存起来,然后将内存地址赋值给函数名,函数名就是对这段代码的引用,这和变量的定义是相似的。
没有事先定义函数而直接调用,就相当于在引用一个不存在的’变量名’。

函数的语法结构

def 函数名(参数1,参数二...):
	'''文档描述'''
    函数体代码
    return 返回值

# 1. def: 定义函数的关键字;
# 2. 函数名:函数名指向函数内存地址,是对函数体代码的引用。函数的命名应该反映出函数的功能;
# 3. 括号:括号内定义参数,参数是可有可无的,且无需指定参数的类型;
# 4. 冒号:括号后要加冒号,然后在下一行开始缩进编写函数体的代码;
# 5. """文档描述""": 描述函数功能,参数介绍等信息的文档,非必要,但是建议加上,从而增强函数的可读性;
# 6. 函数体:由语句和表达式组成;
# 7. return 值:定义函数的返回值,return是可有可无的。

python 光标多行 python文件光标_python 光标多行_13

注意事项

"""
定义函数需要使用def关键字
	定义函数的过程不会执行函数体代码 只会检测语法
                def s(x, y):
                    if      语法错误定义的时候就会报错
		def s():
		    abcdef哈哈哈  定义的时候不会报错
调用函数需要使用函数名加括号
"""

python 光标多行 python文件光标_函数体_14