python基础06-文件操作

文件操作

一、文件的作用

  • 把一些长期存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力
    • 持久化储存数据

二、文件的打开与关闭

1. 文件操作流程

  1. 打开文件,或者新建立一个文件
  2. 读/写数据
  3. 关闭文件

2. 打开文件

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

  • 文件变量 = open(文件名字,访问模式)
    • 注意:文件名字,访问模式都是字符串格式

示例如下:

# 'w': 只写方式打开文件,文件不存在创建,文件存在,清空文件内容
f = open('xxx.txt', 'w')

说明:

访问模式 说明
r 只用于读取, 默认模式。文件不存在,会报错。
w 只用于写入。文件存在则先清空内容, 文件不存在,创建新文件。

3. 关闭文件

3.1 手动关闭文件

  • 关闭文件,为了释放资源
  • 语法格式:文件变量.close()

示例如下:

# 'w': 只写方式打开文件,文件不存在创建,文件存在,清空文件内容
f = open('xxx.txt', 'w')

# 关闭文件,为了释放资源
# 文件变量.close()
f.close()

3.2 自动关闭文件

with open("123.txt", "w") as f:
    pass  # 执行完缩进代码, 会自动关闭文件

三、文件的读写

1. 写数据

  • 使用 write() 可以完成向文件写入数据
  • 语法格式:文件变量.write(所需的内容)

示例代码:

# 1. 打开文件,只写方式打开
f = open('xxx.txt', 'w')


# 2. 写文件
# 写文件格式:文件变量.write(所需的内容)
f.write('hello abc')
f.write(' hello python')

# 3. 关闭文件
f.close()

2. 读数据

2.1 read

  • 格式语法:

    内容变量 = 文件变量.read(n)
    • n 为读取的字符数,不设置则全部读取

案例演练:

  • xxx.txt文件内容如下:

    hello abc hello python
  • 示例代码:

# 1. 打开文件,只读方式打开,'r'
# 'r': 打开文件,必须存在,不存在,报错崩溃
f = open('xxx.txt', 'r')

# 2. 读取文件内容
# 格式: 内容变量 = 文件变量.read(读取的长度)
#       如果read的长度不指定,默认读取全部

ret = f.read(4)  # 读取4个字符
print(ret)

# 下次,继续接着上一次的位置
ret = f.read(7)  # 接着读取7个字符
print(ret)

ret = f.read()  # 接着读取剩下所有个字符
print(ret)

# 3. 关闭文件
f.close()

2.2 readlines

  • readlines() 一次全部读出,读取所有的行,按行作为分隔条件,返回列表 (每行内容是一个元素)
  • 语法格式:内容列表变量 = 文件变量.readlines()

案例演练:

  • xxx.txt文件内容如下:

    hello abc
    hello python
    hello mike
  • 示例代码:

# 1. 打开文件,只读方式打开,'r'
# 'r': 打开文件,必须存在,不存在,报错崩溃
f = open('xxx.txt', 'r')

# 2. 读取文件内容
# readlines: 读取所有的行,按行作为分隔条件
# 格式:内容列表变量 = 文件变量.readlines()
content_list = f.readlines()
# '\n'换行符,代表换行
print(content_list)

# 通过for取出列表的所有元素
for v in content_list:
    print(v)

# 3. 关闭文件
f.close()

2.3 readline

  • readline() 每次读取一行数据
  • 语法格式:内容变量 = 文件变量.readline()

案例演练:

  • xxx.txt文件内容如下:

    hello abc
    hello python
    hello mike
  • 示例代码:

# 1. 打开文件,只读方式打开,'r'
# 'r': 打开文件,必须存在,不存在,报错崩溃
f = open('xxx.txt', 'r')

# 2. 读取文件内容
# readlines: 读取所有的行
# readline:   一次读取一行
# readline格式:内容变量 = 文件变量.readline()
content = f.readline()
print(content)

content = f.readline()
print(content)

content = f.readline()
print(content)

# 3. 关闭文件
f.close()

四、打开文件详解

1. 访问模式说明

访问模式 说明
r 只用于读取, 默认模式。文件不存在,会报错。
w 只用于写入。文件存在则先清空内容, 文件不存在,创建新文件。
a 只用于写入。文件存在则追加内容, 文件不存在,创建新文件。
r+ 用于读写。文件不存在,会报错。
w+ 用于读写。文件存在则先清空内容, 文件不存在,创建新文件。
a+ 用于读写。文件存在则追加内容, 文件不存在,创建新文件。
rb 二进制格式的只读操作。后续网络课程中具体讲解。
wb 二进制格式的只写操作。后续网络课程中具体讲解。
ab 二进制格式的追加操作。后续网络课程中具体讲解。

1.1 只读方式打开文件

  • 只读方式打开文件,文件不存存在,报错

示例代码:

# 'r',只读方式打开文件,文件不存存在,报错
f = open('abc.txt', 'r')

f.close()

1.2 只写方式打开文件

  • 只写方式打开文件,文件不存在新建,文件存在清空文件内容

示例代码:

# 'w',只写方式打开文件,文件不存在新建,文件存在清空文件内容
f = open('abc.txt', 'w')

f.close()

1.3 追加方式打开文件

  • 追加方式打开文件,文件不存在新建,文件存在写光标则放在文件末尾,写数据直接写在文件末尾
    • 注意:追加方式打开文件,不会清空文件内容

案例演练:

  • abc.txt文件内容如下:

    hello abc
    hello python
    hello mike
  • 示例代码:

# 1. 'a',追加方式打开文件
f = open('abc.txt', 'a')

# 2. 写数据
f.write('^_~')

# 3. 关闭文件
f.close()

2. 打开文件路径说明

2.1 open第一个参数说明

  • open 第一个参数,实际上是 路径 + 文件名
  • 路径主要分为:绝对路径和相对路径

2.2 绝对路径和相对路径

  • 绝对路径:是指文件在硬盘上真正存在的路径,是电脑完整的路径

    • 如 windows 平台下:E:\Code\PyCode

    • 注意:写代码的时候,windows下路径的 \ 需要改为 \\ 或者改为 /

      'E:\\Code\\PyCode\\abc.txt'
      'E:/Code/PyCode/abc.txt'    # 推荐这种写法
    • 一般而言,写程序很少使用到绝对路径,因为程序在本机运行可以找到这个绝对路径,但是,把程序拷贝给别人运行,别人电脑不一定有这个路径

  • 相对路径:相对于自己的目标文件位置

  • 1.txt`:等价于`./1.txt`,当前路径下的`1.txt
    ../1.txt: 上一级路径下的1.txt

五、应用:文件备份案例

1. 功能演示

  • 输入文件的名字,然后程序自动完成对文件进行备份

2. 示例代码

"""
a. 输入需要拷贝的文件名 old_file_name = input()
b. 找文件名字右边的第一个点,通过切片组装成: 旧文件名[备份].后缀

1. 只读方式打开源文件(旧文件)
2. 只写方式打开新的备份文件(新文件)
3. while True:
    4. 一次读取一点源文件的内容
    5. 如果读取的内容,往写文件中写
    6. 如果没有读到内容,文件已经读取完毕,break跳出循环
7. 关闭文件
"""

# a. 输入需要拷贝的文件名 old_file_name = input()
old_file_name = input('输入需要拷贝的文件名: ')

# b. 找文件名字右边的第一个点,通过切片组装成: 旧文件名[备份].后缀
# 找文件名字右边的第一个点,rfind, r为right, 从右往左找
pos = old_file_name.rfind('.')
new_file_name = old_file_name[0:pos] + '[备份]' + old_file_name[pos:]

# 1. 只读方式打开源文件(旧文件),加上'b'选项,二进制的意思,为了处理任何类型的文件
src_f = open(old_file_name, 'rb')

# 2. 只写方式打开新的备份文件(新文件),加上'b'选项,二进制的意思,为了处理任何类型的文件
dst_f = open(new_file_name, 'wb')

# 3. while True:
while True:
    # 4. 一次读取一点源文件的内容
    ret = src_f.read(1024)
    # 5. 如果读取的内容,往写文件中写
    if ret:
        dst_f.write(ret)
    # 6. 如果没有读到内容,文件已经读取完毕,break跳出循环
    else:
        break


# 5. 关闭文件
src_f.close()
dst_f.close()

六、文件的相关操作

1. 文件的相关操作

有些时候,需要对文件进行重命名、删除等一些操作,Python的 os 模块中都有这么功能

操作流程:

# 1. 导入模块,只需导入一次即可
import os
# 2. 使用os中的方法,完成功能
os.方法名()

1.1 文件重命名

  • os模块中的rename()可以完成对文件的重命名操作
  • 语法格式:os.rename(旧的文件名,新的文件名)
import os

os.rename("毕业论文.txt", "毕业论文-最终版.txt")

1.2 删除文件

  • os模块中的remove()可以完成对文件的删除操作,不能删除文件夹
  • 语法格式:os.remove(待删除的文件名)
import os

os.remove("毕业论文.txt")

1.3 创建文件夹

  • 创建文件夹,只能创建文件夹,不能创建普通文件
  • 语法格式:os.mkdir(文件夹的名字)
import os

os.mkdir("张三")

1.4 删除空文件夹

  • 删除文件夹,只能删除空的文件夹
  • 语法格式:os.rmdir(待删除文件夹的名字)
import os

os.rmdir("张三")

1.5 获取当前目录

  • 获取当前工作的路径
  • 语法格式:路径变量 = os.getcwd()
import os

work_path = os.getcwd()
print(work_path)

1.6 改变默认目录

  • 改变默认目录,切换指定的路径
  • 语法格式:os.chdir(改变的路径)
import os

os.chdir("../")  # 切换到上一级路径

1.7 获取目录列表

  • 获取某个目录的文件信息,获取文件夹或文件的名字

  • 语法格式:

    目录列表变量 = os.listdir(指定某个目录)
    • 如果不指定目录,默认当前路径
import os

temp_list = os.listdir()  # 获取当前目录下的文件信息
print(temp_list)

1.8 判断文件是否存在

  • 语法格式:

    os.path.exists(需要判断的文件)
    • 如果文件存在返回True,如果文件不存在返回False
import os

ret = os.path.exists('1.txt')
print(ret)

2. 应用:批量修改文件名

示例代码

"""
1. 获取pytest的目录信息,返回文件名的列表
2. 切换到目标路径
3. for遍历文件名的列表取出某个元素
4. 对这个元素重命名
"""
import os

# 1. 获取pytest的目录信息,返回文件名的列表
name_list = os.listdir('pytest')
# print(name_list)

# 2. 路径切换
os.chdir("pytest")

# 3. for遍历取出文件名的列表某个元素
for name in name_list:
    # print(name)
    # 4. 对这个元素重命名
    new_name = '[黑马出品]-' + name
    os.rename(name, new_name)

七、文件版学生名片管理系统

1. 字符串、容器类型相互转换

函数 说明
str(容器变量) 将 容器变量 转换为一个字符串
eval( 字符串内容 ) 返回传入字符串内容的结果,字符串里面看到像是什么,就转换成什么

示例代码:

# 列表
user_list = [{'name': 'mike', 'age': 34, 'tel': 110},
             {'name': 'yoyo', 'age': 30, 'tel': 120}]

# 列表转字符串
temp_str = str(user_list)
print(temp_str, type(temp_str))

# 字符串
my_str = "[{'name': 'mike', 'age': 34, 'tel': 110}, {'name': 'yoyo', 'age': 30, 'tel': 120}]"

# 字符串转列表
# eval(), 看到像什么,就转换什么
my_list = eval(my_str)
print(my_list, type(my_list))

运行结果:

[{'name': 'mike', 'age': 34, 'tel': 110}, {'name': 'yoyo', 'age': 30, 'tel': 120}] 
[{'name': 'mike', 'age': 34, 'tel': 110}, {'name': 'yoyo', 'age': 30, 'tel': 120}] 

2. 文件版学生名片管理系统

2.1 保存数据

def save_info():
    """名片信息保存到文件"""
    # 1. 通过with打开文件,自动处理关闭
    with open('stu.txt', 'w') as f:
        # 2. 将列表转换为字符串后,再往文件中写
        f.write(str(user_list))

2.2 读取数据

def load_info():
    """加载数据"""
    # 1 判断文件是否存在,不存在,中断函数
    # 文件开头需要 import os
    if not os.path.exists('stu.txt'):
        print('文件不存在,无法加载')
        return

    # 2 文件存在的时候,加载数据
    # 2.1 通过with打开文件,只读方式打开文件
    with open('stu.txt', 'r') as f:
        # 2.2 文件变量.read()读取所有内容,返回内容是字符串类型
        content = f.read()
        # 2.3 global 声明user_list全局变量
        global user_list
        # 2.4 把读取内容通过eval转换成列表,给全局变量的列表赋值
        user_list = eval(content)
        print('数据成功加载')