python文件操作
文章目录
- 一、文件概述
- 1.1、文件类别
- 1.2、文件路径
- 1.3、文件的编码方式
- 二、常规文件操作
- 2.1、文件操作通用语句
- 2.2、文件访问模式
- 2.3、文本文件的读和写
- 2.4、二进制文件的读和写
- 三、CSV文件操作
- 3.1、csv模块常用函数
一、文件概述
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)
- os.path.exists(path) 可以检查给定路径的文件或目录是否存在于文件系统中。这是在进行文件读写操作前的必要检查,以避免因文件不存在而导致的错误。
- 3.1、csv模块常用函数