Python中文件操作(IO流)及文件备份

IO流主要作用与计算机中的输入与输出操作,一般来说,常见的IO流操作是内存和磁盘之间的输入和输出,它是一种持久操作,将数据持久化在磁盘上

在计算机中,它只能识别0和1,因此我们的文本文件要被计算机识别并存储在硬盘中需要我们利用编码技术将内容翻译成0和1存入。在计算机中有许多编码:UTF-8、GBK、Big5等等,不同的编码,对于相同的内容翻译成的二进制也不相同

UTF-8为目前全球通用的编码格式

文件的读取

在Python中使用open函数可以打开一个已存在的文件或者创建一个新文件

语法:open(name,mode,encoding)

name:目标文件名的字符串或者是文件所在的具体路径

mode:打开文件的模式

encoding:编码格式

f = open("a.txt","w",encoding="UTF-8")

注意:encoding的顺序位置不是第三位,所以不能使用位置参数,需要用关键字参数指定

在open函数中有三种基础访问模式即mode,分别为r、w、a

r:以只读方式打开文件,其文件指针放在开头(默认模式)

w:以只写方式打开文件,如果文件已存在则打开文件并且从头开始编辑文件,原有内容会被删除,若果文件不存在则会创建一个新文件

a:以追加方式打开文件,如果文件已存在则会在原有内容后添加新内容,如果文件不存在则会创建一个新文件进行写入

read()方法

语法:文件对象.read(num)

num表示要从文件中读取的长度,单位为字节,如果没有num则表示读取文件中所有数据

f = open("a.txt","r",encoding="UTF-8")
print(f"读取十个长度:{f.read(10)}")

读取十个长度:hello word

但是需要注意的是,当重复读取时,它不会从头开始读取,而是从上次读取位置开始

f = open("a.txt","r",encoding="UTF-8")
print(f"读取十个长度:{f.read(10)}")
print(f"读取十个长度:{f.read(10)}")

读取十个长度:hello word
读取十个长度:!
python
p

readlines()方法

按照行的方式将文件中的内容进行一次性读取,返回值为列表,文件中的每一行数据为一个元素

f = open("a.txt","r",encoding="UTF-8")
print(f"内容为:{f.readlines()}")

内容为:['hello word!\n', 'python\n', 'pycharm']

readline()方法

一次性读取一行内容

f = open("a.txt","r",encoding="UTF-8")
print(f"第一行:{f.readline()}")
print(f"第二行:{f.readline()}")

第一行:hello word!

第二行:python

for循环读取文件行

f = open("a.txt","r",encoding="UTF-8")
for i in f:
    print(f"每一行数据为:{i}")

每一行数据为:hello word!

每一行数据为:python

每一行数据为:pycharm

close()关闭文件对象

在读取文件后需要关闭文件对象

通过close()方法关闭文件,如果不关闭文件,会导致文件一直被Python程序占用

f = open("a.txt","r",encoding="UTF-8")
f.close()

文件的写入

首先需要将文件打开模式改为w

write()方法

直接调用write()方法后并不会直接写入文件,而是会先在程序的内存中即缓冲区

在程序运行后,文件内容会清空即为内容,但是在程序运行中时,write()中的内容并不会写入,只有在程序运行完后write()中的内容才会写入

因此我们想要在程序运行中就将write()中的内容写入就需要使用flush()方法

import time
f = open("a.txt","w",encoding="UTF-8")
f.write("1111111")
time.sleep(100000)

flush()方法

flush()为内容刷新,在write()方法使用后调用flush()会将缓冲区中的内容写入文件中

import time
f = open("a.txt","w",encoding="UTF-8")
f.write("1111111")
f.flush()
time.sleep(100000)

 文件的追加

如果文件存在则在文件原有内容后追加内容

f = open("a.txt","a",encoding="UTF-8")
f.write("\n2222222")
f.flush()
f.close()

补充

IO操作字节数据:将mode改为rb或wb

字节可以操作任何数据,字符只能操作字符数据

f = open("1.jpg","rb")
print(f.read())

注意:字节流操作大数据时,不建议一次性读取

文件备份

字符流读到最后返回“”,字节流读到最后返回b“”

简易版:

def copy(src,dest):
    f1 = open("src","rb")
    f2 = open("dest","wb")
    f2.write(f1.read())

优化版:

from os import path
import uuid
def copy(src,dest):
    src = input("请输入你要备份的数据路径:")
    dest = input("请输入你要保存的数据路径:")
    f1 = open("src","rb")
    filename = src[src.rfind("\\")+1:]
    f2 = open(path.join(dest,filename),"wb")
    while True:
        #以M为单位读取数据
        date = f1.read(1024*1024)
        if date == b"":
            print("数据备份完成")
            break
        else:
            f2.write(date)
    f1.close()
    f2.close()

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏大橙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值