day12--文件处理

python文件处理


1、什么是文件?

文件是操作系统提供给用户/应用程序操作硬盘的一种虚拟概念(接口)

2、为什么要用文件?

#用户/应用程序可以通过文件将数据永久保存到硬盘中,即操作文件就是操作硬盘。

#用户/应用程序直接操作的是文件,对文件进行的所有操作都是在向操作系统发送系统调用,然后再由操作系统将其转换成具体的硬盘操作。

3、如何操作文件?

控制文件读写的模式有两种:t/b,这两种模式不能单独使用,必须要和r/w/a一起使用

t模式:

# 读写都必须以字符串(unicode)为单位
# 只能针对文本文件进行操作
# 需要指定字符编码(如:encoding='utf-8')

b模式:

# 读写都是以bytes 为单位
# 可以针对所有文件
# 不能指定字符编码

文件的操作模式


1、r模式的使用

# 登陆验证功能
inp_user = input(">>>>your name:").strip()
inp_pwd = input(">>>>your password:").strip()
with open('user.txt', mode='rt', encoding='utf-8') as f:
    for line in f:
        username, password = line.strip().split(':')
        if inp_user == username and inp_pwd == password:
            print('login success')
            break
    else:
        print('账号或密码错误')

2、w 模式的使用

# w模式用来创建全新的文件
# 文本文件的拷贝工具
src_file = input('源文件路径>>:').strip()
copy_file = input('源文件路径>>:').strip()
with open(r'{}'.format(src_file), mode='rt', encoding='utf-8') as f1,\
  open(r'{}'.format(copy_file), mode='wt', encoding='utf-8') as f2:
    # res = f1.read()
    # f2.write(res)
    for line in f1:
        f2.write(line)

3、a 模式的使用

# a模式用来再原有的文件内容的基础之上写入新的内容,比如记录日志
# 注册功能
name = input('>>>>your name:').strip()
pwd = input('>>>>your password:').strip()
with open('db.txt', mode='at', encoding='utf-8') as f:
    f.write('{name}:{pwd}\n'.format(name,pwd))

4、+模式的使用(了解)

# +不能单独使用,必须配合r、w、a
with open('g.txt',mode='r+t',encoding='utf-8') as f:
    # print(f.read())
    f.write('中国')

with open('g.txt',mode='w+t',encoding='utf-8') as f:
    f.write('111\n')
    f.write('222\n')
    f.write('333\n')
    print('====>',f.read())


with open('g.txt',mode='a+t',encoding='utf-8') as f:
    print(f.read())

    f.write('444\n')
    f.write('5555\n')
    print(f.read())

控制文件读写内容的模式


1、t模式的使用

# t模式的存操作
'''
  1、读写都以字符串(unicode)为单位
  2、只能针对文本文件
  3、必须指定encoding字符编码
'''
# 1、r(默认的操作模式):只读模式,当文件不存在时报错,当文件存在时文件指针跳到开始位置
with open('r.txt', mode='rt', encoding='utf-8') as f:
    print('第一次读'.center(50,'*'))
    res = f.read() # 把所有内容从硬盘读入内存
    print(res)

    print('第二次读'.center(50,'*'))
    res1 = f.read() # 把所有内容从硬盘读入内存
    print(res1)

# 2、w:只写模式,当文件不存在时会创建空文件,当文件存在时会清空文件,指针位于开始位置
'''
强调1:
强调2:如果重新以w模式打开文件,则会清空文件内容
'''
with open('w.txt', mode='wt', encoding='utf-8') as f:
    f.write('哈哈哈\n')
    f.write('哈哈哈\n')
    f.write('哈哈哈\n')

# 3、a:只追加写,在文件不存在时会创建空文档,在文件存在时文件指针会直接跳到末尾
with open('w.txt', mode='at', encoding='utf-8') as f:
    f.write('哈哈哈\n')
    f.write('哈哈哈\n')
    f.write('哈哈哈\n')

'''
强调w模式与a模式的异同:
相同点:再打开的文件不关闭的情况下,连续的写入,新内容总会跟在前写的内容之后
不同点:以a模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾
'''   

2、b模式操作文件

# b: binary模式
'''
  1、读写都是以bytes为单位
  2、可以针对所有文件
  3、一定不能指定字符编码
'''
with open(r'a.mp4', 'rb') as f:
    f.read()



# 文件拷贝工具
src_file = input('请输入源文件路径:').strip()
copy_file = input('请输入文件保存的路径:').strip()
file_name = src_file.split('\\')[-1]
with open(r'{}'.format(src_file), 'rb') as rf,\
    open(r'{src}\{copy}'.format(src=copy_file, copy=file_name), 'wb') as wf:
    for line in rf:
        wf.write(line)

# 循环读取文件
# 方式一:自己控制每次读取的数据量
with open(r'test.jpg', 'rb') as f:
    while True:
        res = f.read(1024) # 一次只读1024个字节
        if len(res) == 0:
            break
        print(len(res))

# 方式二:以行为单位,一次读取一行的数据
with open(r'test.jpg','rb') as f:
    for line in f:
        print(line)

文件操作的方法


1、读写操作:

# 一:读相关操作
# 1、readline:一次读一行
with open(r'test.txt', 'rt', encoding='utf-8') as f:
    while True:
        line = f.readline()
        if len(line) == 0:
            break
        print(line)
        
# 2、readlines:
with open(r'test.txt', 'rt', encoding='utf-8') as f:
    while True:
        line = f.readlines()
        print(line)
'''
强调:
f.read()与f.readlines()都是将内容一次性读入内容,如果内容过大会导致内存溢出
'''

# 二:写相关操作
# 3、f.writelines():
with open(r'test.txt', 'wt', encoding='utf-8') as f:
    # f.write('1111\n222\n3333\n')
    # l=['1111\n', '2222', 3333] # 会报错,应为是t模式,必须是str类型
    l=['1111\n', '2222', '3333']
    # for line in l:
    #     f.write(line)
    f.writelines(l)
    
with open(r'test.txt', 'wb') as f:
    # 补充1:纯英文字符,可以不做转换通过加前缀b得到bytes类型
    l=[b'1111\n', b'2222', b'3333']
    
    # 补充2:'上'.encode('utf-8')等同于bytes('上',encoding='utf-8')
    l=['矮跟'.encode('utf-8'), ''.encode('utf-8'), 'SB'.encode('utf-8')]
    l=[
        bytes('矮跟',encoding='utf-8'),
        bytes('',encoding='utf-8'),
        bytes('SB',encoding='utf-8')
    ]
    f.writelines(l)
# 4、flush (大多数情况不用)
with open(r'test.txt', 'wt', encoding='utf-8') as f:
    f.write('哈哈哈')
    f.flush() # 告诉操作系统,强制立刻将数据写入内存

2、其他操作(了解)

with open(r'test.txt', 'wt', encoding='utf-8') as f:
    print(f.readable())  # 文件是否可读
    print(f.writable())  # 文件是否可写
    print(f.closed)      # 文件是否关闭
    print(f.encoding)    # 如果文件打开模式为b,则没有该属性
    print(f.flush())     # 立刻将文件内容从内存刷到硬盘
    print(f.name)        # 获取文件名

3、控制文件指针的移动

'''
指针移动的单位都是以bytes/字节为单位
只有一种情况下特殊:
    t模式下的read(n),n代表的是字符个数
'''
with open('test.txt', 'rt', encoding='utf-8') as f:
    res=f.read(4)
    print(res)
    
# f.seek(n,模式):n指的是移动的字节个数
# 模式0:参照物是文件开头位置
f.seek(9,0) # 9
f.seek(3,0) # 3
# 模式1:参照物是当前指针所在位置
f.seek(9,1) # 9
f.seek(3,1) # 12
# 模式2:参照物是文件末尾位置,应该倒着移动
f.seek(-9,2) # 3
f.seek(-3,2) # 9

'''
强调:只有0模式可以在t下使用,1、2必须在b模式下使用
'''

猜你喜欢

转载自www.cnblogs.com/surpass123/p/12506234.html