Python基础_文件操作

本文详细介绍了Python中的文件操作,包括打开、读写、追加、关闭等模式,以及异常处理。同时,讲解了JSON和pickle模块在序列化和反序列化中的应用,如何将对象转换为字符串或二进制并存储到文件,以及如何从文件中恢复这些对象。示例代码清晰展示了具体操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码

def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None,
         closefd=True):  # known special case of open

    Open file and return a stream.  Raise OSError upon failure.

说明

"""
打开文件并返回一个流。失败时引发 OSError
"""

参数

  """
    file: 必需,文件路径(相对或者绝对路径)。
    mode: 可选,文件打开模式
    buffering: 设置缓冲
    encoding: 一般使用 utf8
    errors: 报错级别
    newline: 区分换行符
    closefd: 传入的 file 参数类型
    opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。
    
    mode常见参数:
        b	二进制模式。
        r	以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
        r+	打开一个文件用于读写。文件指针将会放在文件的开头
        w	打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
        w+	打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件
        a	打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
        a+	打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
        一般用a+,追加文本内容
    """

file 对象

  """
    file.close()
    关闭文件。关闭后文件不能再进行读写操作。
    
    file.readline([size])
    读取整行,包括 "\n" 字符。
    
    file.readlines([sizeint])
    读取所有行并返回列表,若给定 sizeint>0,返回总和大约为 sizeint 字节的行,实际读取值可能比 sizeint 较大,因为需要填充缓冲区。
    
    file.write(str)
    将字符串写入文件,返回的是写入的字符长度。
    
    """

举例

'文本内容存储到列表中'

li = []
with open("xxx.txt", "a+", encoding="utf-8") as file:
    for line in file.readlines():
        line = line.strip()
        li.append(line)

复制文件和文件夹

import os
import shutil

'os.chdir()将当前工作目录更改为指定路径。'
'可以理解为os.changedir()路径可以始终指定为字符串。'
'在某些平台上,路径也可以指定为打开的文件描述符。'
'如果此功能不可用,则使用它会引发异常'
os.chdir("C:\\")

复制到某目录下(默认保留源文件名)

shutil.copy(r'D:\\源文件夹\\源文件.png', r'D:\复制后文件夹')
'这里如果是不同的操作系统,则可以是使用os.sep去区分分隔符在加上f-string格式化'
shutil.copy(f'D:{os.sep}源文件夹{os.sep}源文件.png', f'D:{os.sep}复制后文件夹')

复制到某目录下(修改源文件名)

shutil.copy(r'D:\\源文件夹\\源文件.png', r'D:\复制后文件夹\复制后文件名.png')
shutil.copy(r'D:\\源文件夹\\源文件.png', r'D:\复制后文件夹\复制后文件名.jpg')

复制文件夹

shutil.copytree(r'D:\\源文件夹', r'D:\复制后文件夹')

移动文件和文件夹

# shutil.move () 可以将文件或目录移到另一个目录中
shutil.mover('D:\\源文件夹', r'D:\\复制后文件夹')
'后面不带分割符为文件夹,后面带分隔符一般会有文件'

重命名文件和文件夹

"source"
os.rename(src="", dst="", src_dir_fd="", dst_dir_fd="")
os.rename("a.txt,b.txt")
os.rename("源文件夹", "新的源文件夹")

序列化和反序列化

'通过文件操作,我们可以将字符串写入到一个本地文件。'
'但是,如果是一个对象 (例如列表、字典、元组等),就无法直接写入到一个文件里,需要对这个对象进行序列化,然后才能写入到文件里。'
"""
序列化:将数据从内存持久化保存到硬盘的过程。
反序列化:将数据从硬盘加载到内存的过程。
python 里存入数据只支持存入字符串和二进制。
json: 将 Python 里的数据 (str/list/tuple/dict) 等转换成为对应的 json。
pickle: 将 Python 里任意的对象转换成为二进制。
Python 中提供了 JSON 和 pickle 两个模块用来实现数据的序列化和反序列化。

"""

JSON 序列化

'存储到文件用dump,转储'
import json

file = open('names.txt', 'w')
names = ['小A', '吃饭']


# file.write(names)  出错,不能直接将列表写入到文件里

# 可以调用 json的dumps方法,传入一个对象参数
result = json.dumps(names)

# dumps 方法得到的结果是一个字符串
print(type(result))  # <class 'str'>

# 可以将字符串写入到文件里
file.write(result)

file.close()

JSON实现反序列化

'区别loads和load'
import json

# 调用loads方法,传入一个字符串,可以将这个字符串加载成为Python对象
result = json.loads("['小A', '吃饭']")
print(type(result))  # <class 'list'>


import json

# 以可读方式打开一个文件
file = open('names.txt', 'r')
# 调用load方法,将文件里的内容加载成为一个Python对象
result = json.load(file)
print(result)
file.close()  # ['小A', '吃饭']

pickle 模块

‘和 json 模块类似,pickle 模块也有 dump 和 dumps 方法可以对数据进行序列化,同时也有 load 和 loads 方法进行反序列化。’
‘区别在于,json 模块是将对象转换成为字符串,而 pickle 模块是将对象转换成为二进制。’
‘pickle 模块里方法的使用和 json 里方法的使用大致相同,需要注意的是,pickle 是将对象转换成为二进制,’
‘所以,如果想要把内容写入到文件里,这个文件必须要以二进制的形式打开。’

pickle 序列化

"dumps 方法将 Python 数据转换成为二进制"
import pickle
names = ['小A', '吃饭']
b_names = pickle.dumps(names)
file = open('names.txt', 'wb')
file.write(b_names)  # 写入的是二进制,不是存文本
file.close()

"dump 方法将 Python 数据转换成为二进制,同时保存到指定文件"


import pickle
names = ['小A', '吃饭']
file2 = open('names.txt', 'wb')
pickle.dump(names, file2)
file2.close()

pickle模块实现反序列号

'loads 方法,将二进制加载成为 Python 数据'
import pickle
file1 = open('names.txt', 'rb')
x = file1.read()
y = pickle.loads(x)
print(y)
file1.close()

'load 方法,读取文件,并将文件的二进制内容加载成为 Python 数据'
import pickle
file3 = open('names.txt', 'rb')
z = pickle.load(file3)
print(z)

'参考:-->https://blog.csdn.net/python2021_/article/details/124793497'

说明

"""

    --json'序列化'
        dumps 方法的作用是把对象转换成为字符串,它本身不具备将数据写入到文件的功能。
        dump 方法可以在将对象转换成为字符串的同时,指定一个文件对象,把转换后的字符串写入到这个文件里
    
    --json'反序列化'
        loads 调用loads方法,传入一个字符串,可以将这个字符串加载成为Python对象
        load  调用load方法,将文件里的内容加载成为一个Python对象
        
    --pickle'序列化'
        dumps 方法将 Python 数据转换成为二进制
        dump 方法将 Python 数据转换成为二进制,同时保存到指定文件
        
    --pickle'反序列化'
        loads 方法,将二进制加载成为 Python 数据
        load 方法,读取文件,并将文件的二进制内容加载成为 Python 数据
        
    -- 带s的不参与文件操作
    -- 不到s的参与文件操作
    
    -- 序列化 dump (存储)
    -- 反序列化 load (读取)
        
"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值