python文件操作

发布于:2024-07-01 ⋅ 阅读:(16) ⋅ 点赞:(0)


一、文件概述

1.1、文件类别

文件是存储在辅助存储器上的数据序列,可以包含任何数据内容,如文本、图像、音频、视频等,根据存储格式不同,文件可分为两种类型:文本文件和二进制文件。

文本文件

文本文件一般由采用特定编码方式的字符组成,如UTF-8、ASCII、Unicode等,内容容易统一展示和阅读;大部分文本文件都可通过文本编辑软件或文字处理软件创建、修改和阅读。

Windows记事本创建的.txt文件就是典型的文本文件,以.py为扩展名的python源文件、以.html为扩展名的网页文件等也都是文本文件。

由于文本文件经过了编码,因此,它也可以被看作存储在磁盘上的长字符串;常见的文本编辑软件有记事本、Notepad++等。

二进制文件

二进制文件存储的是由0和1组成的二进制编码,文件内部数据的组织格式与文件用途有关;典型的二进制文件包括.bmp图片文件、.avi视频文件、各种计算机语言编译后生成的文件等。

二进制文件和文本文件的主要区别在于是否有统一的字符编码,二进制文件由于没有统一字符编码,只能当作字节流,而不能看作字符串。

1.2、文件路径

文件有两个关键属性,分别是“文件名”和“文件路径”,其中,文件名指的是为每个文件设定的名称,对文件进行创建和访问时,都需要用到文件路径,也就是文件存储的位置或即将存储的位置。

文件路径分为“相对路径”和“绝对路径”;相对路径相对于当前工作目录,即程序所在路径,也就是当前程序存储的位置,如果文件和程序存储在同一个文件夹中,那么创建或访问文件时,可以直接写文件名;绝对路径从根文件夹开始,Windows中以盘符作为根文件夹,而mac或Linux操作系统中以“/”作为根文件夹。

python的os模块是基本操作系统功能模块,包括对文件的一些操作;其中os.path模块提供了一些函数,可以实现绝对路径和相对路径之间的转换,以及检查给定的路径是否为绝对路径。

os.path模块功能:

路径拼接和分割:

  • os.path.join(*paths) 函数能够将多个路径片段合并成一个完整的路径。这种合并考虑了不同操作系统的路径分隔符,可以确保在不同系统上生成正确的路径。例如,在Unix系统上使用此函数会生成以“/”分隔的路径,而在Windows上则生成以“\”分隔的路径。
  • os.path.split(path) 函数用于将路径分割成头部和尾部,分别对应目录名和文件名。这在提取特定部分的路径时非常有用,比如从一个完整的文件路径中仅提取文件名或目录名。

路径和文件相关属性获取:

  • os.path.dirname(path) 和 os.path.basename(path) 分别用于获取路径的目录部分和文件名部分。这两个函数可以有效地从给定路径中提取所需信息,经常被用于文件操作中,比如在读取或写入文件之前确认文件的准确位置。
  • os.path.splitext(path) 函数能够分离文件路径中的文件名和扩展名。这对于需要根据文件类型(通过扩展名判断)进行不同操作的程序特别重要。

检查文件存在性:

  • os.path.exists(path) 可以检查给定路径的文件或目录是否存在于文件系统中。这是在进行文件读写操作前的必要检查,以避免因文件不存在而导致的错误。

获取绝对路径和相对路径:

  • os.path.abspath(path) 返回给定路径的绝对版本。这对于确保路径在所有环境下的一致性和正确性极为重要,特别是在脚本需要在不同的文件系统或操作系统之间移植时。
  • os.path.relpath(path, start) 返回从start到path的相对路径。这在构建相对路径时非常有用,使得路径配置更加灵活和可移植。

解析和构建路径:

  • os.path.normpath(path) 将路径规范化,消除其中冗余的分隔符和上级目录引用(如“…”)。这有助于保持路径的清晰和标准化,避免因为路径格式不一致而引起的问题。
  • os.path.realpath(path) 返回给定路径的真实路径,消除符号链接等导致的路径间接性。这对于确保指向实际物理位置的路径非常关键,尤其是在处理符号链接较多的Unix系统上。

os.path.join(*paths)

# 导入 os 模块,该模块提供了许多操作系统相关的函数和变量
import os

# 定义一个函数 create_directory,该函数用于创建一个目录
def create_directory(path_components, directory_name):
    # 使用 os.path.join 函数将路径组件列表和目录名称连接起来,生成一个完整的目录路径
    # *path_components 语法将路径组件列表展开成多个参数
    directory_path = os.path.join(*path_components, directory_name)

    # 使用 os.makedirs 函数创建目录,exist_ok=True 参数表示如果目录已经存在,不会抛出错误
    os.makedirs(directory_path, exist_ok=True)

    # 返回创建的目录路径
    return directory_path

# 定义路径组件列表
path_components = ['usr', 'local']

# 定义目录名称
directory_name = 'my_directory'

# 调用 create_directory 函数,传递路径组件列表和目录名称作为参数
created_directory = create_directory(path_components, directory_name)

# 打印出创建的目录路径
print(f"创建的目录路径:{created_directory}")

os.path.split(path)

# 导入 os 模块,该模块提供了许多操作系统相关的函数和变量
import os
# 定义一个函数 split_path,该函数用于将路径分解成目录部分和文件名部分
def split_path(path):
    # 使用 os.path.split 函数将路径分解成目录部分和文件名部分
    # os.path.split 函数将路径分解成两个部分:目录部分和文件名部分
    # 它返回一个元组,第一个元素是目录部分,第二个元素是文件名部分
    directory, filename = os.path.split(path)
    # 返回目录部分和文件名部分的元组
    return directory, filename
# 定义一个路径字符串
path = '/usr/local/bin/python.exe'
# 调用 split_path 函数,传递路径字符串作为参数
# 将返回值unpack到 directory 和 filename 变量中
directory, filename = split_path(path)
# 打印出目录部分
print(f"目录部分:{directory}")
# 打印出文件名部分
print(f"文件名部分:{filename}")

os.path.dirname(path)

# 导入 os 模块,该模块提供了许多操作系统相关的函数和变量
import os
# 定义一个函数 get_directory,该函数用于获取路径的目录部分
def get_directory(path):
    # 使用 os.path.dirname 函数获取路径的目录部分
    # os.path.dirname 函数将路径分解成目录部分和文件名部分
    # 它返回目录部分,everything except the last component of the path
    directory = os.path.dirname(path)
    # 返回目录部分
    return directory
# 定义一个路径字符串
path = '/usr/local/bin/python.exe'
# 调用 get_directory 函数,传递路径字符串作为参数
# 将返回值赋值给 directory 变量
directory = get_directory(path)
# 打印出目录部分
print(f"目录部分:{directory}")

os.path.basename(path)

# 导入 os 模块,该模块提供了许多操作系统相关的函数和变量
import os
# 定义一个函数 get_filename,该函数用于获取路径的文件名部分
def get_filename(path):
    # 使用 os.path.basename 函数获取路径的文件名部分
    # os.path.basename 函数将路径分解成目录部分和文件名部分
    # 它返回文件名部分,即路径的最后一个组件
    filename = os.path.basename(path)
    # 返回文件名部分
    return filename
# 定义一个路径字符串
path = '/usr/local/bin/python.exe'
# 调用 get_filename 函数,传递路径字符串作为参数
# 将返回值赋值给 filename 变量
filename = get_filename(path)
# 打印出文件名部分
print(f"文件名部分:{filename}")

os.path.splitext(path)

# 导入 os 模块,该模块提供了许多操作系统相关的函数和变量
import os

# 定义一个函数 get_fileinfo,该函数用于获取路径的文件名和扩展名
def get_fileinfo(path):
    # 使用 os.path.splitext 函数获取路径的文件名和扩展名
    # os.path.splitext 函数将路径分解成文件名和扩展名两个部分
    # 它返回一个元组,第一个元素是文件名,第二个元素是扩展名
    filename, extension = os.path.splitext(path)

    # 返回文件名和扩展名
    return filename, extension

# 定义一个路径字符串
path = '/usr/local/bin/python.exe'

# 调用 get_fileinfo 函数,传递路径字符串作为参数
# 将返回值unpack到 filename 和 extension 变量中
filename, extension = get_fileinfo(path)

# 打印出文件名和扩展名
print(f"文件名:{filename}")
print(f"扩展名:{extension}")

os.path.exists(path)

# 导入 os 模块,该模块提供了许多操作系统相关的函数和变量
import os

# 定义一个函数 check_file_exists,该函数用于检查文件是否存在
def check_file_exists(path):
    # 使用 os.path.exists 函数检查文件是否存在
    # os.path.exists 函数返回一个布尔值,表示文件是否存在
    exists = os.path.exists(path)

    # 如果文件存在,返回 True
    if exists:
        return True
    # 否则,返回 False
    else:
        return False

# 定义一个路径字符串
path = '/usr/local/bin/python.exe'

# 调用 check_file_exists 函数,传递路径字符串作为参数
exists = check_file_exists(path)

# 打印出文件是否存在
if exists:
    print(f"文件 {path} 存在")
else:
    print(f"文件 {path} 不存在")

os.path.abspath(path)

# 导入 os 模块,该模块提供了许多操作系统相关的函数和变量
import os

# 定义一个函数 get_absolute_path,该函数用于获取文件的绝对路径
def get_absolute_path(path):
    # 使用 os.path.abspath 函数获取文件的绝对路径
    # os.path.abspath 函数将相对路径转换为绝对路径
    absolute_path = os.path.abspath(path)

    # 返回绝对路径
    return absolute_path

# 定义一个相对路径字符串
relative_path = 'python.exe'

# 调用 get_absolute_path 函数,传递相对路径字符串作为参数
absolute_path = get_absolute_path(relative_path)

# 打印出绝对路径
print(f"绝对路径:{absolute_path}")

os.path.relpath(path, start)

# 导入 os 模块,该模块提供了许多操作系统相关的函数和变量
import os

# 定义一个函数 get_relative_path,该函数用于获取文件的相对路径
def get_relative_path(path, start):
    # 使用 os.path.relpath 函数获取文件的相对路径
    # os.path.relpath 函数将绝对路径转换为相对路径
    relative_path = os.path.relpath(path, start)

    # 返回相对路径
    return relative_path

# 定义一个绝对路径字符串
absolute_path = '/usr/local/bin/python.exe'

# 定义一个起始路径字符串
start_path = '/usr/local/bin'

# 调用 get_relative_path 函数,传递绝对路径和起始路径作为参数
relative_path = get_relative_path(absolute_path, start_path)

# 打印出相对路径
print(f"相对路径:{relative_path}")

os.path.normpath(path)

# 导入 os 模块,该模块提供了许多操作系统相关的函数和变量
import os

# 定义一个函数 normalize_path,该函数用于标准化文件路径
def normalize_path(path):
    # 使用 os.path.normpath 函数标准化文件路径
    # os.path.normpath 函数将路径标准化为规范形式
    normalized_path = os.path.normpath(path)

    # 返回标准化后的路径
    return normalized_path

# 定义一个路径字符串
path = '/usr/local/bin/../python.exe'

# 调用 normalize_path 函数,传递路径字符串作为参数
normalized_path = normalize_path(path)

# 打印出标准化后的路径
print(f"标准化后的路径:{normalized_path}")

os.path.realpath(path)

# 导入 os 模块,该模块提供了许多操作系统相关的函数和变量
import os

# 定义一个函数 get_real_path,该函数用于获取文件的真实路径
def get_real_path(path):
    # 使用 os.path.realpath 函数获取文件的真实路径
    # os.path.realpath 函数将 symbolic link 解析为真实路径
    real_path = os.path.realpath(path)

    # 返回真实路径
    return real_path

# 定义一个路径字符串
path = '/usr/local/bin/python.exe'

# 调用 get_real_path 函数,传递路径字符串作为参数
real_path = get_real_path(path)

# 打印出真实路径
print(f"真实路径:{real_path}")

1.3、文件的编码方式

在对文件进行操作前,还需要说明以下文件的编码方式,编码就是用数字来表示符号和文字,它是符号、文字存储和显示的基础。

ASCII编码方式

ASCII编码方式是一种基于拉丁字母的电脑编码系统,主要用于显示现代英语和其他西欧语言。ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)定义了128个字符的编码,这些包括大小写英文字母、数字和一些符号,以及控制字符如回车和换行等。每个字符在ASCII中都被分配了一个7位的二进制数,这使得它成为最早的电子文本编码标准之一。

GB2312编码方式

GB2312编码方式是一种针对简体中文的字符集编码标准。GB2312编码标准是中国大陆地区广泛使用的一种中文字符集编码,它是为了适应中文信息处理的需要,由全国信息技术标准化技术委员会在20世纪80年代制定的标准。这种编码方式不仅涵盖了简体中文字符,还包含了一定数量的其他符号,如拉丁字母和日文假名等,满足了当时社会对电脑处理中文的需求

GBK编码方式

GBK编码方式是一种扩展自GB2312的中文字符集编码标准,它兼容GB2312并在此基础上增加了更多的汉字和符号。这种编码方式在中文信息处理中扮演着重要角色,特别是在早期的中文计算机应用环境中。

Unicode编码方式

Unicode编码是一种全球字符编码标准,旨在为世界上所有的文字和符号提供一个统一且唯一的编码。Unicode由Unicode联盟开发和维护,该联盟是一个非盈利组织,成员包括主要的计算机公司和其他对字符编码感兴趣的机构。Unicode的目标是解决在多语言环境下不同编码系统之间的兼容性问题,促进全球信息的交换。

UTF-8编码方式

UTF-8编码是一种针对Unicode字符集设计的可变长度的字符编码标准。它使用一至四个字节来表示每个字符,能够覆盖Unicode字符集的所有字符。

二、常规文件操作

python对文件的操作通常按照以下3个步骤进行。

  • 读写文件前需要请求操作系统打开一个文件对象(通常称为文件描述符)。
  • 然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
  • 最后关闭对象。

2.1、文件操作通用语句

使用open()函数打开或建立文件,返回一个file对象。
语法格式

fileobj = open(filename[,mode])
open(file_name[,access_mode] [,buffering] [,encoding])
  • filename:filename变量存储了待访问文件的名称。
  • mode:mode决定了文件访问模式。
  • buffering:如果buffering的值被设为0,就不会有寄存,如果buffering的值取1,访问文件时就会寄存,如果buffering的值设为大于1的整数,即为寄存区的大小,如果buffering取负值,寄存区的大小则为系统默认值。
  • encoding:表示返回的数据采用何种编码方式
# 定义文件名
file_name = "example.txt"

# 尝试打开文件并读取内容
try:
    # 使用with语句打开文件,确保文件在操作完成后自动关闭
    with open(file_name, "r") as file:
        # 读取文件内容
        content = file.read()
        # 打印提示信息
        print("文件已存在,内容如下:")
        # 打印文件内容
        print(content)
# 如果文件不存在,捕获FileNotFoundError异常
except FileNotFoundError:
    # 使用with语句创建新文件,并写入内容
    with open(file_name, "w") as file:
        # 写入内容
        file.write("新创建的文件")
        # 打印提示信息
        print("文件不存在,已创建新文件并写入内容。")

2.2、文件访问模式

模式 描述
t 文本模式(默认)
x 写模式
b 二进制模式
u 通用换行模式
r 以只读模式打开文件
rb 以二进制格式打开一个文件用于只读
r+ 打开一个文件用于读写
rb+ 以二进制格式打开一个文件用于读写
w 打开一个文件只用于写入
wb 以二进制格式打开一个文件只用于写入
w+ 打开一个文件用于读写
wb+ 以二进制格式打开一个文件用于读写
a 打开一个文件用于追加
ab 以二进制格式打开一个文件用于追加
a+ 打开一个文件用于读写
ab+ 以二进制格式打开一个文件用于读写

2.3、文本文件的读和写

文本文件的读入

从文本文件的读入数据的步骤:打开文件、读取数据和关闭文件。

# 定义文件名
file_name = "myfile.txt"

# 尝试打开文件并读取内容
try:
    # 使用with语句打开文件,确保文件在操作完成后自动关闭
    with open(file_name, "r") as file:
        # 读取文件内容
        content = file.read()
        # 打印提示信息
        print("文件已存在,内容如下:")
        # 打印文件内容
        print(content)
# 如果文件不存在,捕获FileNotFoundError异常
except FileNotFoundError:
    # 打印提示信息
    print("文件不存在。")

文本文件的写出

将数据写出到文本文件的步骤:创建或打开文件、写出数据和关闭文件。

# 定义文件名和要写入的数据
file_name = "myfile.txt"
data = "这是要写入文件的数据。"

# 尝试打开文件并写入数据
try:
    # 使用with语句打开文件,确保文件在操作完成后自动关闭
    with open(file_name, "w") as file:
        # 将数据写入文件
        file.write(data)
        # 打印提示信息
        print("数据已成功写入文件。")
# 如果发生异常,捕获并打印错误信息
except Exception as e:
    print("写入文件时发生错误:", e)

2.4、二进制文件的读和写

二进制文件的读入

从二进制文件读入数据的步骤:创建或打开文件、读取数据和关闭文件。

file_name = "myfile.txt"
try:
    with open(file_name, "rb") as file:
        content = file.read()
        print("文件已存在,内容如下:")
        print(content)
except FileNotFoundError:
    print("文件不存在。")

D:\pythonLED\python.exe E:/pythonProject/1.py
文件已存在,内容如下:
b'\xd5\xe2\xca\xc7\xd2\xaa\xd0\xb4\xc8\xeb\xce\xc4\xbc\xfe\xb5\xc4\xca\xfd\xbe\xdd\xa1\xa3'

二进制文件的写出

将数据写出到二进制文件的步骤:创建或打开文件、写出数据和关闭文件。

file_name = "myfile.txt"
data = b"This is binary data."
try:
    with open(file_name, "wb") as file:
        file.write(data)
        print("数据已成功写入文件。")
except Exception as e:
    print("写入文件时发生错误:", e)

三、CSV文件操作

CSV文件是一种纯文本文件,用于存储表格和电子表格信息。

  • 概念:CSV是Comma Separated Values(逗号分隔值)的缩写,它通过特定的结构来表示表格数据,通常用于简单数据的导入和导出操作。这种格式被广泛支持,可以在多种程序之间轻松迁移数据。
  • 特点:CSV文件使用逗号作为字段分隔符,行中的每个单元格由逗号分隔。第一行通常包含列标题,为每列数据提供说明。
  • 编码:虽然CSV文件可能使用不同的字符编码,7-bit ASCII提供了最基本的通用编码方式,确保了文件在不同环境中的可读性。
  • 应用:CSV文件格式在用户、商业以及科学计算领域都有广泛应用,特别是在需要在不同的应用程序间传输表格数据时。例如,数据库程序通常会提供将数据导出为CSV文件的功能,以便其他电子表格程序能够导入这些数据。
  • 兼容性:CSV并没有一个固定的通用标准,但RFC 4180文档提供了一个基础性的描述,很多实现都遵循这一描述。由于CSV格式简单,许多程序都允许用户预览文件内容,并指定分隔符、转义规则等,以确保正确读取数据。
  • 操作:CSV文件可以通过任何文本编辑器创建和查看,同时大多数电子表格程序如Microsoft Excel、OpenOffice Calc和Google Sheets都能直接打开和处理CSV文件。当使用这类专业软件打开CSV文件时,数据将以表格形式呈现,方便用户阅读和编辑。

3.1、csv模块常用函数

reader函数

# 导入csv模块,用于处理CSV文件
import csv
# 定义一个函数,用于读取CSV文件并打印每一行数据
def read_csv_file(file_path):
    # 使用with语句打开文件,确保文件在操作完成后自动关闭
    with open(file_path, 'r') as file:
        # 创建一个csv.reader对象,用于读取CSV文件
        csv_reader = csv.reader(file)
        # 遍历csv_reader中的每一行数据
        for row in csv_reader:
            # 打印当前行的数据
            print(row)
# 调用函数并传入CSV文件路径
read_csv_file('example.csv')

我们首先导入了csv模块。然后定义了一个名为read_csv_file的函数,该函数接受一个参数file_path,表示要读取的CSV文件的路径。在函数内部,我们使用open函数打开文件,并指定模式为只读(‘r’)。然后,我们创建了一个csv.reader对象,将打开的文件作为参数传递给它。接下来,我们使用for循环遍历csv_reader对象中的每一行数据,并将其打印出来。最后,我们调用read_csv_file函数,并传入CSV文件的路径作为参数。

writer函数

import csv

# 定义一个函数,用于将数据写入CSV文件
def write_csv_file(file_path, data):
    # 使用with语句打开文件,确保文件在操作完成后自动关闭
    with open(file_path, 'w', newline='') as file:
        # 创建一个csv.writer对象,用于写入CSV文件
        csv_writer = csv.writer(file)
        # 遍历数据列表
        for row in data:
            # 将每一行数据写入CSV文件
            csv_writer.writerow(row)

# 定义要写入CSV文件的数据
data = [
    ['Name', 'Age', 'City'],
    ['Alice', '25', 'New York'],
    ['Bob', '30', 'San Francisco'],
    ['Charlie', '35', 'Los Angeles']
]

# 调用函数并传入CSV文件路径和数据
write_csv_file('example.csv', data)