python-文件操作

1、文件的操作模式

1.1、控制文件的操作模式:

r(默认):制度

w:只写

a:追加

1.1.1、r模式

r只读模式:在文件不存在的时候报错,文件存在则文件内指针直接跳到文件开头

with open('路径+文件名',encoding='UTF-8') as f:
    data = f.read()
复制代码
u1 = input('u:').strip()
p1 = input('p:').strip()

with open('a.txt', 'r', encoding='utf-8') as f:
    for line in f:
        u, p = line.strip('\n').split(':')
        if u1 == u and p1 == p:
            print('true')
            break
    else:
        print('false')
 

#输出结果  

u:zf
p:123
true

复制代码

1.1.2 、w模式

w只写模式:在文件不存在的时候会创建空文档,文件存在会清空文件,文件指针跑到文件开头

with open('a.txt', 'w', encoding='utf-8') as f:
    f.write('xxx\n')
    f.wirte('yyy')

 

强调:

1、在文件不关闭的情况下,连续写入,后写的内容一定跟在前写内容的后面

2、如果重新以w模式打开文件,则会清空文件内容

1.1.3、a模式

a:只追加写模式:在文本不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾

with open('a.txt', 'a', encoding='utf-8') as f:
    f.write('xxx')

 

a模式与w模式同异

1、相同:在打开不关闭情况下,连续的写入,新写的内容总会跟在前些的内容后面

2、不同:以a模式重新打开文件,不会清空源文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后

练习简单的注册功能:

u1 = input('u:').strip()
p1 = input('p:').strip()

with open('a.txt', 'at', encoding='utf-8') as f:
    info = f'{u1}:{p1}'
    f.write('\n')
    f.write(info)

 

1.1.4、+模式

r+ w+ a+:可读可写

平时一般不用可读可写模式

1.2、控制文件读写内容的模式

t、b模式均不能单独使用,必须与a/w/r之一结合使用

t(默认的):文本模式

  1、读写文件都是以字符串为单位的

  2、只能针对文本文件

  3、如果是windows系统,则必须指定encoding参数为UTF-8,因为windows系统默认的编码是GBK

b:二进制模式

  1、读写文件都是以bytes/二进制为单位的

  2、可以针对所有文件

  3、一定不能指定encoding参数

1.2.1、t模式

文件存取硬盘本质都是二进制的形式,当指定t模式时,内部帮我们做了编码和解码

1.2.3、t/b比较

  1、在操作纯文本文件方面t模式帮我们省去了编码和解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便

  2、针对非文本文件(如图片、视频、音频等)只能使用b模式

  3、在b模式不能用encoding来指定编码

拷贝文件案例:

with open('a.txt', 'rt', encoding='utf-8') as f1, open('b.txt', 'wt', encoding='utf-8') as f2:
    for line in f1:
        f2.write(line)

 

 

2、文件操作的方法

2.1、重点

读写操作

1、f.read()          # 读取所有内容,执行完该操作后,文件指针会移动到文件末尾

2、f.readline()# 读取一行内容,指针会移动到第二行首

4、f.readlines()   # 读取每一行内容,存放与列表中

 

强调:

f.read()和f.readlines()都是将内容全部读取,如果内容过大会导致内存溢出,若还想将内容全读入内存,则必须分多次读入,有两种方式实现:

方式一:

with open('a.txt','rt',encoding='utf-8') as f:
    for line in f:
        print(line)

 

方式二:

with open('a.txt', 'rb') as f:
    while True:
        data = f.read(1024)
        if len(data) == 0:
            break
        print(data)

 

3、控制文件内指针移动

文件内指针移动都是以bytes为单位的,只有在t模式下的f.read(n),此时n的单位是字符,也就是多少字符的含义。

with open('a.txt', 'rt', encoding='utf-8') as f:
    print(f.read(3)) # 读取3个字符

 

with open('a.txt', 'rb') as f:
    print(f.read(3)) # 读取3个bytes

 

f.seek详细方法如下:

f.seek(指针移动的字节数,模式控制):

模式控制:

0:默认模式,该模式代表指针移动的字节数是以文件开头为参照的

1:该模式代表指针移动的字节是以当前所在的位置为参照的

2、该模式代表指针移动的字节是以文件末尾的位置为参照的

3.1、0模式的使用

with open('b.txt', 'rt', encoding='utf-8') as f:
    f.seek(3, 0)  # 参照文件开头移动了3个字节
    print(f.tell())  # 查看当前文件指针距离文件开头的位置
    print(f.read())  # 从第3个字节的位置读到文件末尾,输出结果为:你好

 

注意:由于在t模式下,会将读取到的内容自动解码,所以必须保证读取到的内容是一个完整的中文数据,否则解码无效。

1
2
3
with open('b.txt', 'rb') as f:
    f.seek(7, 0)
    print(f.read().decode('utf-8'))

3.2、1模式的使用

复制代码
with open('b.txt', 'rb') as f:
    f.seek(3, 1)
    print(f.tell())
    f.seek(4, 1)
    print(f.tell())



输出结果:
3
7
复制代码

 

3.3、2模式的使用

复制代码
with open('b.txt', 'rb') as f:
    f.seek(0, 2)
    print(f.tell())
    f.seek(-3, 2)
    print(f.tell())

输出:

10
7

复制代码

 

4、文件的修改方式

方式一、

将文件内容一次性全部读入内存,然后在内容中修改完毕之后再覆盖写回源文件

方式二、

以读文件方式打开源文件,以写方式打开一个临时文件,一行行读取源文件内容,修改完之后写入临时文件,删除源文件,降临时文件重命名为源文件。

 

posted @   Tatataaa  阅读(95)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示