python笔记day12

文件高级及基本函数使用

1.文件模式

  • x模式(控制文件操作模式)-》了解
    x 只写模式【不可读:不存在则创建,存在则报错
#x模式 只写模式 安全写模式,避免覆盖
with open('a.txt',mode='x',encoding='utf-8') as f:
    f.write('123')
  • b模式补充(控制文件读写内容的模式)
    bytes类型转换
    x=10 #int(10)
    '你'.encode('gbk)#bytres()
    t 模式 读写都是字符串 只能针对文本文件 必须指定字符编码
    b 模式 binary 读写以bytes为单位 针对所有文件 文本文件也可以 一定不能指定编码
with open(r'aa.webp',mode='r') as f:#默认文本模式 没有读的时候还没乱码
    #res=f.read() #读入内存并decode解码操作  乱码
    pass
with open('aa.jpeg',mode='rb') as f:#b模式是啥读啥二进制
    res=f.read(24) #为了显示简单会进行封装显示成16进制
    print(res)
    print(type(res))
    pass
with open('aa.txt',mode='rb') as f:#b模式是啥读啥二进制
    res=f.read(24) #为了显示简单会进行封装显示成16进制 针对英文会直接按8个bytes显示
    print(res)
    print(type(res))
    print(res.decode('utf-8'))
    pass
#b模式应用案例
with open(r'e.txt',mode='wb')as f:
    f.write('哈哈哈\n'.encode('utf-8'))
    f.write('嘻嘻嘻\n'.encode('gbk'))
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00H\x00H\x00\x00\xff\xe1\x00X'
<class 'bytes'>
b'\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88xixixi'
<class 'bytes'>
哈哈哈xixixi
#文件拷贝工具
with open('e.txt',mode='rb') as f1,\
    open('f.txt',mode='wb') as f2:
    res=f1.read()
    f2.write(res)
    
src_file=input('源文件路劲》》').strip()
dst_file=input('目标文件路径》》》').strip()
with open(r'{}'.format(src_file),mode='rt',encoding='utf-8') as f1,\
    open(r'{}'.format(dst_file),mode='wt',encoding='utf-8') as f2:
    # res=f1.read() #内存占用过大
    # f2.write(res)
    for line in f1:
        f2.write(line)
        

#循环读取文件
#方式一 控制每次读取的数据量
with open('aa.jpeg',mode='rb') as f:
    while True:
        res=f.read(32768)#以字节为单位读入 当一行特别长的时候用while省内存
        if len(res)==0:
            break
        print(len(res))
#方式二 以行为单位
with open('aa.jpeg',mode='rb') as f:
    js=0
    for line in f:
        print(line)#以\n为分割
        js+=1
        if(js==1):break #文件太大了。。。

32768
32768
32768
32768
32768
32768
22428
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00H\x00H\x00\x00\xff\xe1\x00XExif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x02\x01\x12\x00\x03\x00\x00\x00\x01\x00\x01\x00\x00\x87i\x00\x04\x00\x00\x00\x01\x00\x00\x00&\x00\x00\x00\x00\x00\x03\xa0\x01\x00\x03\x00\x00\x00\x01\x00\x01\x00\x00\xa0\x02\x00\x04\x00\x00\x00\x01\x00\x00\x06@\xa0\x03\x00\x04\x00\x00\x00\x01\x00\x00\x06@\x00\x00\x00\x00\xff\xed\x008Photoshop 3.0\x008BIM\x04\x04\x00\x00\x00\x00\x00\x008BIM\x04%\x00\x00\x00\x00\x00\x10\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\t\x98\xec\xf8B~\xff\xc0\x00\x11\x08\x06@\x06@\x03\x01"\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1f\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n'

2.文件操作的其他方法

读相关

  • readline
  • readlines
#按行读取readline
with open('e.txt',mode='rt',encoding='utf-8') as f:
    # res1=f.readline()
    # res2=f.readline()
    # print(res2)
    while True:
        res=f.readline()
        if len(res)==0:
            break
        print(res)
#readliens 按行读入到列表里 和read一样是一次性读入 读的文件过大时会溢出
with open('e.txt',mode='rt',encoding='utf-8') as f:
    res=f.readlines()
    print(res)
哈哈哈������

1234
['哈哈哈������\n', '1234']

写相关

#witelines
with open('e.txt',mode='at+',encoding='utf-8') as f:
    f.write('hhh\nhhhgggg\n')
    f.writelines(['1111\n','1222','3333'])#循环取出写到文件
    l=['1111\n','1222','3333']
    for line in l:
        f.write(line)
    
#b模式下
l=[b'fdasf\n',b'sdf\n',b'dfas\n']#纯英文 直接加b
l=[bytes('牙牙乐\n',encoding='utf-8'),bytes('冲呀\n',encoding='utf-8')]
with open('e.txt',mode='ab+') as f:
    f.writelines(l)

flush

写操作 会攒一波字符一起写入硬盘
flush 立马丢到硬盘里
最好不用,

了解

  • readable
  • writable
  • closed 判断是否关闭
  • name
  • encoding
#flush
with open('e.txt',mode='at+',encoding='utf-8') as f:
    f.write('hhh\nhhhgggg\n')
    f.flush()
#
with open('e.txt',mode='rt',encoding='utf-8') as f:
    print(f.readable())
    print(f.writable())
    print(f.encoding)
    print(f.name)
    print(f.closed)

True
False
utf-8
e.txt
False

3.文件高级操作:控制文件指针的移动

指针移动单位是bytes 字节为单位
只有t模式下的read(n)代表字符个数
f.seek

with open('e.txt',mode='rt',encoding='utf-8')as f:
    res=f.read(5)
    print(res)
#f.seek:移动以字节为单位
#f.seek(n,模式):n是移动字节数
#模式
#模式0:参照物是文件开头位置 只有0模式可以在t模式下使用
#模式1:参照物是当前指针所在的位置
#模式2:参照物是文件末尾,应该移动负数
#f.tell()获取文件指针当前的位置
with open('e.txt',mode='rb')as f:
    print('0 mode')
    f.seek(3,0)
    f.seek(5,0)
    print(f.tell())
    res=f.read(15)
    print(res.decode('utf-8'))
    print('1 mode')
    f.seek(9,1)
    print(f.tell())
    f.seek(3,1)
    print(f.tell())
    print('2 mode')
    f.seek(-9,2)
    print(f.tell())
    f.seek(-3,2)
    print(f.tell())

hhh
h
0 mode
5
hhhgggg
1234hh
1 mode
29
32
2 mode
196
202
posted @ 2025-03-13 00:14  anozzz  阅读(36)  评论(0)    收藏  举报