• 疫情环境下的网络学习笔记 python 3.16


    x 模式

    只写模式,不可读,不存在则创建文件,文件存在报错

    with open('c.txt',mode = 'x',encoding = 'utf-8') as f:
    	f.write('aaa')
    

    相当于加了一个判断,看文件是否存在,比较鸡肋

    • Windows平台换行符 :早期计算机使用硬盘,让机器手臂换到下一行,再回到行首

      mac平台Linux平台换行符: 不同平台存在差异,但是python3解决了这个问题,写 就可以了

    控制文件读写内容的模式

    t模式

    1. 读写都是以字符(Unicode)为单位
    2. 只能针对文本文件
    3. 必须指定字符编码

    对于非文本文件,使用open()打开,不指定encoding,如不进行.read()操作,不会报错,因为在read功能下才会把Unicode解码成utf。

    b模式

    with open('path','rb') as f:
    	res = f.read()
    	print(res,type(res))
    # 得到一个bytes类型,一堆二进制
    
    1. 读写都是以bytes为单位

    2. 可以对所有单位进行操作

    3. b模式一定不能指定模式,指定了就报错

      硬盘里是什么,read就得到什么,是什么格式二进制,就得到什么二进制,不解码

      python解释器会把二进制转换成十六进制,英文二进制转成英文显示,想在python中显示别的格式,用 .decode() 方法

      • 在b模式对文本文件进行读,写操作,要指定编码格式手动编码,解码

      • 若直接用字符串(Unicode)写,直接报错:应该用bytes格式写

        with open('path','rb') as f:
        	f.write('你好'.encode('gbk'))
        
      • 用decode之后就相当于用 t 模式

    总结:t 模式帮我们自动帮我们完成了编码和解码的环节,但是只针对文本模式。b 模式可以打开所有文件

    改写:文件拷贝工具

    • 以rb模式打开源文件,wb模式打开新文件

      open(r'{}','rb') as f,open(r'{}',wb) as g:
      	for line in f:
      		g.write(f)
      

      在b模式中,依然是以 为分隔符分为一行行,供循环使用

    • 两种循环方式:for line,while + read(n)

    f.read(n)

    • f.read(n) 指定读取的字节个数,f.read(1024),一次读1024个字节
    • 当文件一行内容过长,for循环一次占用很多内存,应该使用while循环 + f.read(n) 方法读,该种方法不受一行长度的影响,可以指定每次读取字节的长度

    读的其他方法

    f.readline()

    一次读一行,读完一行光标在一行末尾。不存在读文件过大造成内存占用问题

    用 while True + readline() 相当于 for line + read()

    f.readlines()

    从当前位置起始,往后读出所有的行,每一行作为一个元素存进列表,返回一个大列表。与f.read() 一样,读的内容过大的时候会造成内存占用过多

    写的其他方法

    f.writelines([list])

    相当于for循环一个列表,把每个元素写进f,不自动换行,与 .readlines() 相对应,但是不换行

    • t模式下,入参列表中每一个元素必须是str,否则报错
    • 对于不是英文的字符,在b模式下要用 .encode('utf-8') 编码成bytes再write,对于纯英文字符,直接在字符串前加 b就是一个bytes类型了
    • str.encode('utf-8') 等同于 b = bytes(str,encoding = 'utf-8'),是bytes类型的转换方法

    f.flush

    在进行一次写操作时,操作系统不会对每一次操作都马上执行,而是攒够了一定的数据量、指令量才会操作,是操作系统的一种优化

    f.flush():强制执行操作,不进行等待

    其他方法

    f.readable()
    f.writable()
    ...
    

    控制文件指针的移动

    指针移动的单位都是以bytes(字节)为单位,只有在 t 模式下的 .read(n)特殊,n代表的是字符个数

    with open('aaa.txt','rt',encoding ='utf-8') as f:
    	res = f.read(4)
    	print(res)
    

    f.seek(n,mode)

    移动指针,n指的是移动的字节(bytes)个数

    模式

    • 0:参照物是文件开头位置

      f.seek(9,0) 移动到整个文件的第九个字节位置

    • 1:参照物是当前指针所在位置移动,可以正向,也可以负向移

      f.seek(3,1) 以当前位置开始,往后移动3个字节

    • 2:参照物是文件末尾位置,因为末尾后面没有字节,应该倒着移动指针

    只有 0 模式可以在t 下使用,1 和 2 模式都要在b 模式下使用,使用则报错

    使用seek 移动指针的时候,可以一个个字节移动,但是如果移动到中文字符三个字节的中间,再进行解码读写操作,则报错

    f.tell() :获取相对于文件开头,当前指针位置

  • 相关阅读:
    正式定居博客圆,发些以前在Topcoder上的练习题,对算法和STL有兴趣的朋友可以看下:)
    TopCoder真题讲解之二
    “命名空间“System”中不存在类型或命名空间名称“Linq”(是缺少程序集引用吗?)”
    短信发送
    JavaScript打印和预览等
    .net获取IP地址的几种方法转载
    WinForm中控件与背景透明
    用C#实现C/S模式下软件自动在线升级转
    Microsoft Access 时间函数汇总
    .net 发送Email 单发 群发
  • 原文地址:https://www.cnblogs.com/telecasterfanclub/p/12503719.html
Copyright © 2020-2023  润新知