python——文件的IO操作(IO==Input&Output)

文件的IO操作

在了解文件的IO操作前,我们需要了解在计算机中什么才是文件?

一、文件的概述

计算机中的所有数据都是文件!
(1)文件的分类
广义上说文件是按照文件的类型进行分类的,比如说:视频文件、音频文件、图片文件、文档文件…
狭义上说文件是按照组成文件的数据格式进行分类的:文本文件,二进制文件。
文本文件:可以使用记事本正常打开的文件,里面是各种编程语言的源代码。
二进制文件:使用记事本打开会出现乱码的文件。
(2)文件的作用
使用文件的目的是把一些数据存储存放起来
(3)使用文件的流程
操作一个文件的流程一般是:打开文件,读写文件,关闭文件。通过程序操作文件的流程也是这三步。

二、文件的读写操作

python中提供了内置函数open()可以对文件进行读写操作。在cmd命令行中输入help(open),可以看到open()的详细用法。

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

(1)文件IO
IO:Input&Output
①输出(Output):程序中的数据保存到计算机文件中
②输入(Input):将计算机的文件内容读取到程序中
(2)文本文件读取

file = open('file/test.txt', mode='r')   # 以读取的方式打开文件,文件打开的默认方式也是读取(mode='r')
ret = file.read()             # 读取文件的内容
print(ret)                    # 打印从文件读取的内容
file.close()         #关闭打开文件

(3)文本文件的写入

file = open('file/test.txt', mode='w')    # 以写入的方式打开文件(mode='w'),如果文件不存在则会创建该文件
file.write("人生苦短,我用python")     # 向文件写入文本
file.close()                           # 关闭文件

(4)二进制文件的读取

file = open("test1.txt", mode="rb")      # b表示的是二进制文件
file.read()
file.close()

(5)二进制文件的写入

file = open('file/test.txt', mode='rw')    # 以写入的方式打开二进制文件(mode='wb'),如果文件不存在则会创建该文件
file.close()                           # 关闭文件

(6)文件复制案例代码
文件复制其实可以理解为将一个文件中的数据读取出来,然后写入一个新的文件中,这就完成了文件的复制操作。

def copy(file1, file2):
    """
    这是一个文件复制函数
    file1是被复制文件
    file2是复制后的文件
    """
    # 1、打开被复制的文件file1
    f1 = open(file1, mode='rb')
    # 2、读取file1文件的内容
    content = f1.read()
    # 3、以写入的方式打开file2文件
    f2 = open(file2, mode='wb')
    # 4、将读取到的file1文件的内容写入file2文件中
    f2.write(content)
    # 5、关闭file2文件
    f2.close()
    # 6、关闭file1文件
    f1.close()

(7)文件复制案例完善
在上面的文件复制函数中,我们执行之后发现文件复制完成后没有提示,这对于用户体验而言是极其不友好的,因此咱们来给该文件复制函数增加一个读取进度及完成提示功能。

"""
通过os.path.getsize()获取文件的大小
"""
import os
def copy(file1, file2):
    """
    这是一个文件复制函数
    file1是被复制文件
    file2是复制后的文件
    """
    # 1、打开被复制的文件file1
    print('开始读取文件{}的内容'.format(file1))
    f1 = open(file1, mode='rb')
    print(f'文件大小{os.path.getsize(file1)/1024}k')
    # 2、读取file1文件的内容
    print('开始读取文件{}的数据'.format(file1))
    content = f1.read()
    # 3、以写入的方式打开file2文件
    f2 = open(file2, mode='wb')
    # 4、将读取到的file1文件的内容写入file2文件中
    print('开始读取文件{}的数据'.format(file1))
    f2.write(content)
    # 5、关闭file2文件
    f2.close()
    # 6、关闭file1文件
    f1.close()
    print("文件复制完毕")

(8)文件的读写操作同时执行
r+/rb+:打开一个文件/二进制文件并用于读写,文件指针会放在文件开头;用r+方法打开文件,则可以既对这个文件进行读取操作,也可以进行写入操作。但是执行写入操作的时候,写入内容会把原文件内容覆盖,写入多少覆盖多少。
未写入前文件111.txt内容:
在这里插入图片描述

# r+ 打开一个文件用于读写。文件指针将会放在文件的开头。写入内容会把原文件内容覆盖,写入多少覆盖多少。
file = open("demo_02/111.txt","r+")
file.write("12345")
file.close()

执行写入操作后文件111.txt内容:
在这里插入图片描述
w+/wb+:打开一个文件/二进制文件用于读写,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果文件不存在则创建新文件。
未执行代码前的文件:
在这里插入图片描述

# w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,
# 即 原有内容会被删除。如果该文件不存在,创建新文件。
file = open("demo_02/1.txt","w+")
ret = file.read()
print(ret)
file.close()

执行代码后的文件列表
在这里插入图片描述
a+/ab+:打开一个文件/二进制文件用于读写,如果文件已存在,指针放在文件末尾,即新写入的内容追加到文件末尾;如果文件不存在则创建新文件用于读写。
执行代码前:
在这里插入图片描述

# a+  打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。
# 文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
file = open("demo_02/2.txt","a+")
ret = file.read()
print(ret)
file.close()

执行代码后:
在这里插入图片描述

三、with语句

with语句是是文件读写操作的一大福音。正常情况下咱们每次打开文件后都需要关闭文件。但是使用with语句后就可以自动关闭文件,不用手动关闭了。

'''with语句具体语法'''
with open(file, mode="r") as f:
	# 操作文件内容,with语句中包含的代码执行完成
	f.read()
	# 自动关闭文件(自动调用close())

四、csv文件的操作

csv是python 中提供的一个内建模块,使用的时候需要import csv引入操作

import csv
# (1)写入数据
# 系统数据
users = [
    ["大树", 18, "男"],
    ["阿飞", 20, "女"]
]

# 打开文件,并获取到csv模块的writer对象
with open("user.csv", "w", newline="") as file:
    # 获取writer对象
    writer = csv.writer(file)
    # 写标题
    writer.writerow(["姓名", "年龄", "性别"])
    # 写入系统用户,保存数据
    writer.writerows(users)

# (2)读取数据
with open("user.csv", "r") as file:
    # 获取reader对象
    reader = csv.reader(file)
    # 展示数据
    for row in reader:
        print(row)

csv模块案例

# 这是一个与电影有关的字典,字典中又包含列表,列表中又包含字典
# 要实现的结果,将电影名称,主演,链接等等分别形成一列,并写入csv文件中。
movie_dict2 = {
   
    'data': [
        {
   'directors': ['费振翔'], 'rate': '8.3', 'cover_x': 1429, 'star': '40', 'title': '龙岭迷窟', 'url': 'https://movie.douban.com/subject/30488569/', 'casts': ['潘粤明', '张雨绮', '姜超', '高伟光', '佟磊'], 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2593664928.jpg', 'id': '30488569', 'cover_y': 2000}, {
   'directors': ['莱恩·约翰逊'], 'rate': '8.2', 'cover_x': 1685, 'star': '40', 'title': '利刃出鞘', 'url': 'https://movie.douban.com/subject/30318116/', 'casts': ['丹尼尔·克雷格', '安娜·德·阿玛斯', '克里斯·埃文斯', '杰米·李·柯蒂斯'
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值