python基础(六)-文件操作与函数简介

今日内容

其他文本模式补充

  • r+ 可读可写
  • w+ 可读可写
  • a+ 可读可写

另外,r\w\a为纯净模式

rt模式下,read内( )中的数字表示的是字符的个数;除此之外,数字表示的都是字节

 

控制文件内容光标的移动

with open(r'test','r',encoding='utf-8') as f:

  f.seek(offset,whence)

offset

  • 相对偏移量,光标移动的位数

whence

  • 0:参照文件的开头,t和b模式都可以使用
  • 1:参照光标所在的当前位置,只能在b模式下用
  • 2:参照文件的末尾,只能在b模式下使用
with open(r'test','rt',encoding='utf-8') as f:

  print(f.read(1))

  f.seek(6,0)  # seek移动的都是字节数

  print(f.read(1))

  f.seek(0,0)  # 移动到首位

  print(f.read(1))

 

with open(r'test','rb',encoding='utf-8') as f:

  print(f.read(3).decode('utf-8'))

  f.seek(0,0)

  print(f.read(3).decode('utf-8'))

 

with open(r'test','rt',encoding='utf-8') as f:

  print(f.read(3))

  f.seek(1,1)

  print(f.read(1))  # 报错,此时光标已在最末位,无法再读取

 

with open(r'test','rb',encoding='utf-8') as f:

  print(f.read(3))

  f.seek(3,1)

  print(f.read(1))

 

with open(r'test','rt',encoding='utf-8') as f:

  print(f.read())

  f.seek(3,2)

  print(f.read(1))

  f.seek(-3,2)

  print(f.read())

 

with open(r'test','a',encoding='utf-8') as f:

  print(f.read())

  f.seek(3,2)

  print(f.read(1))

  f.seek(-3,2)

  print(f.read())

 

实时监测文件内容变化

import time

res = time.strftime('%Y-%m-%d %X')

print(res,type(res))

with open(r'test','a',encoding='utf-8') as f:

  f.write('%s egon给jason发了一个亿的工资\n'%res)

进阶:实时检测是否有新内容增加

with open(r'test01.txt','rb',encoding='utf-8') as f:

  f.seek(0,2)  # 先将光标移动到文件末尾

  while True:

    res = f.readline()

    print(f.tell())  # 查看光标移动了多少位(字节)

    if res:

      print('新增的文件内容:%s'%res.decode('utf-8'))

# if如果res有值,说明有人操作当前文件

    else:

# 如果res没有值,说明文件没有被任何人操作

      print('暂无其他人操作文件')

  print(f.read())

截断文件:

with open(r'test','a',encoding='utf-8') as f:

  f.truncate(6)  # 保留0~6字节数,后面的全部删除(截断)。接收的字节的长度,必须为int整型数据

 

文件修改:

先将数据由硬盘读到内存(读文件),在内存中完成修改(字符串的替换),再覆盖原来的内容(写文件)。

注意:同一个文件不能同时使用两种模式(r\w\a),不能既读又写。

  • 1)文件修改方式1:类似于覆盖
with open(r'test','r+',encoding='utf-8') as f:

  f.seek(6,0)

  f.write('')

 

with open(r'test','r',encoding='utf-8') as f:

  data = f.read()

  print(data)

  print(type(data))
with open(r
'test','w',encoding='utf-8') as f:   res = data.replace('egon','jason')   print(data)   f.write(res)

'''

但是上面这种方法也有优缺点;

优点:任何时候,硬盘上只有一个文件,不会占用过多的硬盘空间

缺点:当文件过大时,可能会造成内存溢出

'''

  • 2)文件修改方式2:类似于搬运

创建一个新文件,循环读取老文件内容到内存进行修改,将修改好的内容写到新文件中,将老文件删除,将新文件的名字改成老文件名字。

import os  # 调用os模块

with open(r'test1','r',encoding='utf-8') as read_f,\

open(r'test2','a',encoding='utf-8') as write_f:

  for line in read_f:

  new_line = line.replace('jason','egon')

  write_f.write(new_line)

os.remove('test1')

os.rename('test2','test1')

'''

这种方式也有优缺点:

优点:内存中始终只有一行内容,不占内存

缺点:在某一时刻,硬盘上会同时存在两个文件,占用硬盘空间,但是这个时间段很短

'''

 

函数简介

什么是函数?

  函数就是工具,函数必须先定义后调用(函数名+括号)

为什么要有函数?(待定)

如何是使用函数?(待定)

 

函数体代码定义阶段只检测语法,不执行代码

def my_len()  # def为定义函数的关键字

  n = 0

  for i in l:

    n += 1

    print(n)

my_len()

print(my_len())

'''

可以通过变量名找到变量对应的值;

可以通过函数名+括号,找到函数体所对应的代码并执行;

函数名的命名规则与变量名相同;

'''

posted @ 2019-07-08 19:02  泡泡茶壶i  阅读(212)  评论(0编辑  收藏  举报