文件操作和函数

一、文件操作

  1.其他模式补充

    r、w、a称为纯净模式

    rb、wb、ab

    注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

    r+:可读,可写

    w+:可读,可写

    a+:可读,可写

  在rt模式下,read内的数字表示字符的个数

  除此之外,数字表示的都是字节(一个中文字符3个bytes,一个英文字符1Bytes)

  2.文件内光标的移动

    read(3):

    (1)文件打开方式为文本模式时,代表读取3个字符

    (2)文件打开方式为b模式时,代表读取3个字节

    f.seek(offset,whence)

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

      whence:

        0:参照文件的开头,t和b都可以使用

        1:参照光标所在的当前位置,只能在b模式下用

        2:参照文件的末尾,只能在b模式下使用      

    truncate是截断文件,文件打开方式必须可写,但不能用w或w+等方式打开(直接清空文件),所以truncate要在r+或a或a+等模式下测试效果

with open(r'test','a',encoding='utf-8') as f:
    f.truncate(6)  # 接收的字节的长度 整型
    # 保留0~6字节数 后面的全部删除(截断)

    检测文件内容:

with open(r'test01.txt','rb') as f:
    # 先将光标移动到文件末尾
    f.seek(0,2)
    while True:
        res = f.readline()
        # 查看光标移动了多少位 bytes
        print(f.tell())
        if res:
            print("新增的文件内容:%s"%res.decode('utf-8'))
            # 说明有人操作当前文件
        else:
            # 说明文件没有被任何人操作
            print('暂无其他人操作该文件')

 

  ps:写日志

import time
res = time.strftime('%Y-%m-%d %X')
print(res,type(res))  # 记录当前时间

with open(r'test01.txt','a',encoding='utf-8') as f:
    f.write('%s egon给jason发了1个亿的工资\n'%res)

  3.文件的修改

    方式一:

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

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

      缺点:当文件过大的情况下,可能会造成内存溢出

with open(r'test02.txt','r',encoding='utf-8') as f:
    data = f.read()  # 全部读入内存,如果文件很大,会很卡
    print(data)
    print(type(data))

with open(r'test02.txt','w',encoding='utf-8') as f:
    res = data.replace('egon','jason')  # 在内存中完成修改
    print(data)
    f.write(res)  # 一次性写入新文件

    方式二:

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

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

      缺点:在某一时刻硬盘上会同时存在两个文件

import os

with open(r'test02.txt','r',encoding='utf-8') as read_f,\
        open(r'test02.swap','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('test02.txt')
os.rename('test02.swap','test02.txt')

 

二、函数

  计算长度:

s = 'hello'
print(len(s))
s = 'hello'
# 将for循环的代码放到某一个地方,谁要用谁就拿 def my_len(): n = 0 for i in s: n += 1 print(n) my_len()

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

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

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

  注:函数名的命名规则跟变量名一模一样

    函数就是工具,并且函数萹蓄先定义后调用(函数名+括号)

 

posted @ 2019-07-08 16:04  静心学  阅读(98)  评论(0)    收藏  举报