Python青少年简明教程:文件处理
计算机科学中的文件是指存储在计算机存储设备上的数据集合。这些数据可以是程序代码、文本、图像、音频、视频等各种形式的信息。在计算机科学中,文件通常被分为两类:文本文件和二进制文件。
每个文件都有一个唯一的文件名,用于标识该文件。文件名通常由两个部分组成:名字和扩展名(例如,document.txt 中,document 是名字,.txt 是扩展名)。
文件路径(File Path):
文件路径是指文件在计算机文件系统中的位置。路径可以是绝对路径或相对路径。
绝对路径:从根目录开始的完整路径(例如,C:/Users/Username/Documents/file.txt)。
相对路径:相对于当前工作目录的路径(例如,./file.txt,其中 . 代表当前目录)。
文件扩展名是文件名中的后缀,用于标识文件的类型或格式。
【在Windows操作系统中,尽管标准目录分隔符是反斜杠(\),但系统通常也能识别斜杠(/)作为目录分隔符。Unix/Linux系统使用斜杠作为目录分隔符。在许多编程语言中(包括Python),推荐使用斜杠(/)作为路径分隔符,因为它具有更好的跨平台兼容性。】
常见的扩展名包括 .txt(文本文件),.jpg(图像文件),.mp3(音频文件),.mp4(视频文件),.exe(可执行文件)等。
在 Python 中,文件处理是一个常见的任务。Python 和文件之间的交互是 Python 编程中非常重要的一部分。Python 提供了多种方式如内置函数和库来读写文件,这使得处理文件变得既简单又高效。
使用内置的 open() 函数读写文件
Python 提供了内置的 open() 函数和一系列操作文件的标准方法。这些方法包括文件的读、写、追加以及文件的关闭。
Python内置的 open() 函数基本语法如下:
file = open(file_path, mode='r')
参数说明:
参数较多常用的是这两个。
file_path:文件路径,可以是绝对路径或相对路径。
【使用open()函数处理文件时,注意路径问题
绝对路径(Absolute Path):从根目录开始指定文件的完整路径。例如:
以Windows系统为例: C:\\Users\\Username\\Documents\\my_data.csv 或 C:/Users/Username/Documents/my_data.csv
相对路径(Relative Path):相对于当前工作目录的路径。例如:
my_data.csv(指当前目录下的my_data.csv文件)
./my_data.csv(同样指当前目录下的文件)
../my_data.csv(指上一级目录下的my_data.csv文件)】
mode:文件打开模式,指定文件的读写方式。常用的模式包括:
'r':读取模式(默认)。文件必须存在。
'w':写入模式。如果文件存在,会覆盖文件内容;如果文件不存在,会创建新文件。
'a':追加模式。文件指针在文件末尾,不会覆盖文件内容。如果文件不存在,会创建新文件。
'b':二进制模式。例如,'rb'表示以二进制模式读取文件,'wb'表示以二进制模式写入文件。
'x':独占创建模式。如果文件已经存在,操作会失败。
't':文本模式(默认)。用于文本文件,'rt'表示以文本模式读取文件,'wt'表示以文本模式写入文件。
其它参数还有
如:encoding='utf-8'
open() 使用系统默认的字符编码(通常是 UTF-8),但你可以通过 encoding 参数指定其他编码方式。
文件在计算机系统中通常可以分为两大类:文本文件和二进制文件。
文本文件(Text Files)
特点:
文本文件是以 字符 为单位存储数据的文件,这些字符通常是可读的,即可以直接被人类理解。
常见的文本文件格式有 .txt、.csv、.html、.py、.json 等。
文本文件通常使用特定的字符编码方式,例如 UTF-8、ASCII 等。
读取方式:
读取文本文件时,可以直接使用字符串操作,因为文本文件中的数据是以可见字符存储的。
可以使用 'r' 模式打开文本文件进行读取。
二进制文件(Binary Files)
特点:
二进制文件以 字节 为单位存储数据,数据通常不直接对应人类可读的字符,必须经过适当的解码或解析才能理解。
常见的二进制文件格式有 .png、.jpg、.exe、.bin、.zip、.mp3、.mp4 等。
二进制文件包含的内容可以是任何形式的数据:图像、音频、视频、可执行程序等。
读取方式:
读取二进制文件时,数据以字节流的形式获取,通常需要使用 'rb' 模式来打开文件。
写入文本文件
写入文件有多种方式。需要注意的是,如果使用 'w' 模式,会覆盖文件内容,而 'a' 模式则会在文件末尾追加内容。
1 写入字符串
with open('example.txt', 'w') as file:
file.write('Hello, world!')
2 写入多行
lines = ['First line\n', 'Second line\n', 'Third line\n']
with open('example.txt', 'w') as file:
file.writelines(lines)
3 追加内容
使用 'a' 模式可以向现有文件追加内容。
with open('example.txt', 'a') as file:
file.write('This is an additional line.\n')
读取文本文件
1 读取整个文件内容
with open('example.txt', 'r') as file:
content = file.read()
print(content)
2 逐行读取
with open('example.txt', 'r') as file:
for line in file:
print(line.strip()) # `strip()` 去掉行末的换行符
3 读取指定大小的数据
with open('example.txt', 'r') as file:
chunk = file.read(1024) # 读取 1024 字节
print(chunk)
二进制文件读写
对于图片、音频等二进制文件,可以使用 'b' 模式读取或写入。
读取二进制文件:
with open('image.png', 'rb') as file:
data = file.read()
# 处理二进制数据
写入二进制文件:
with open('output.bin', 'wb') as file:
file.write(data)
说明:在 Python 中with 语句是一个非常有用的上下文管理器(context manager),主要用于简化资源管理,确保资源在使用完毕后能够被正确地释放。在不使用 with 语句的情况下,你通常需要手动打开和关闭文件(或其他资源),以避免资源泄漏或文件未及时关闭的问题。例如:
with open('example.txt', 'r') as file:
content = file.read()
# 文件操作
在这个例子中,with 语句确保文件在读取操作完成后自动关闭,无需显式调用 file.close()方法。
不使用 with 语句,你需要这样写:
file = open('example.txt', 'r')
content = file.read()
# 文件操作
file.close() # 文件在使用后关闭
或,更好的写法是:
file = open('example.txt', 'r')
try:
content = file.read()
# 文件操作
finally:
file.close() # 文件在使用后关闭
这种情况下,try-finally 块用于确保即使在读取文件时发生异常,文件也会被正确关闭。
关闭文件
当使用 open() 函数打开文件时,处理完后应调用 file.close() 方法关闭文件。未关闭文件可能会导致内存泄漏或其他问题。
为了避免忘记调用 close(),通常推荐使用 with 语句。
下面给出使用 Python 内置的 open() 函数处理文本文件的完整示例:
# 1. 创建并写入文本文件
with open('example.txt', 'w', encoding='utf-8') as file:
file.write("Hello, world!\n")
file.write("这是一个关于处理文件的示例。\n")
# 2. 读取文本文件
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read()
print("文件内容:")
print(content)
# 3. 逐行读取文件
with open('example.txt', 'r', encoding='utf-8') as file:
print("逐行读取文件内容:")
for line in file:
print(line.strip())
# 4. 追加内容到文本文件
with open('example.txt', 'a', encoding='utf-8') as file:
file.write("追加新行1。\n")
file.write("追加新行2。\n")
# 5. 再次读取文件内容以验证追加操作
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read()
print("追加内容后的文件内容:")
print(content)
运行输出:
文件内容:
Hello, world!
这是一个关于处理文件的示例。
逐行读取文件内容:
Hello, world!
这是一个关于处理文件的示例。
追加内容后的文件内容:
Hello, world!
这是一个关于处理文件的示例。
追加新行1。
追加新行2。
文件和目录操作
Python 的 os 和 shutil 模块都是内置模块。
官方文档:
https://docs.python.org/zh-cn/3/library/os.html
https://docs.python.org/zh-cn/3/library/shutil.html
os 模块:提供了一些与操作系统交互的功能,是 Python 标准库的一部分。使用 os 模块,你可以进行文件和目录操作、管理环境变量、执行系统命令等。
shutil 模块:也是 Python 标准库的一部分,它依赖于 os 模块,并提供了更高级的文件操作,如复制文件、递归复制目录、压缩和解压缩文件等。
由于它们是内置模块,使用时不需要进行额外的安装,只需直接 import os 或 import shutil 即可使用。
os模块使用略举一二
☆获取当前工作目录
os.getcwd()
例如:
import os
print(os.getcwd())
☆列出指定目录的文件和目录
os.listdir(path)
例如:
import os
print(os.listdir('.')) # 列出当前目录下的所有文件和目录
☆检查文件是否存在
os.path.exists(path)
例如:
import os
if os.path.exists('example.txt'):
print('文件存在')
else:
print('文件不存在')
☆删除文件
os.remove(path)
例如:
import os
os.remove('example.txt')
☆获取文件大小
os.path.getsize(path)
例如:
import os
size = os.path.getsize('example.txt')
print(f'文件大小: {size} 字节')
shutil模块使用略举一二
☆复制文件:
shutil.copy(src, dst)只复制文件内容和权限
shutil.copy2(src, dst) 还会复制文件的元数据(如修改时间)
例如:
import shutil
shutil.copy('source.txt', 'destination.txt') # 复制文件
☆复制目录
shutil.copytree(src, dst)
例如:
import shutil
shutil.copytree('src_folder', 'dst_folder') # 递归复制整个目录
☆删除目录及其内容
shutil.rmtree(path)
例如:
import shutil
shutil.rmtree('folder_to_delete') # 递归删除目录及其所有内容
处理CSV格式文件
CSV(Comma-Separated Values)是一种常见的文件格式,主要用于以纯文本形式存储表格数据。CSV格式以其简单性和广泛的支持被广泛应用于数据存储和传输,特别适合处理结构化的表格数据。
由于 CSV 文件只是一个文本文件,你几乎可以在任何文本编辑器中创建一个。你也可以从几乎任何电子表格程序中导出 CSV 文件,如 Microsoft Excel。
CSV文件通常由行和列组成,每一行代表表格中的一条记录,而每一列代表记录中的某个字段。各字段之间通常用逗号(,)分隔。
第一行可以存在一个可选的标题头,格式和普通记录行的格式一样。标题头要包含文件记录字段对应的名称,应该有和记录字段一样的数量。
每一行记录位于一个单独的行上,用回车换行符CRLF(也就是\r\n)分割。整个文件中每行应包含相同数量的字段,各字段之间通过分隔符分隔,现代用法分隔符不仅限于逗号,还可以是分号、制表符或空格。每个字段可用也可不用半角双引号(")括起来,如果字段中包含逗号,通常会用引号将该字段括起来,如果用双引号括字段,那么出现在字段内的双引号前必须加一个双引号进行转义。
例如:
姓名,年龄,城市
张三,25,北京
李四,30,上海
王五,28,广州
提示,分隔符通常是半角字符。
CSV格式文件更多情况可见 https://docs.fileformat.com/zh/spreadsheet/csv/#google_vignette
使用内置的open()函数处理csv文件
Python可以使用上面介绍的内置的open()函数处理csv文件
写入CSV文件
写入 CSV 文件时,需要手动将数据转换为字符串,并用逗号分隔各个字段。写入时需要注意正确处理换行符,以确保每行数据按正确的格式写入文件中。示例:
# 要写入CSV文件的数据
data = [
['姓名', '年龄', '城市'],
['张三', '25', '北京'],
['Bob', '26', 'New York']
]
# 打开文件并写入内容
with open('demo.csv', 'w', encoding='utf-8') as file:
for row in data:
# 将列表转换为逗号分隔的字符串,并添加换行符
line = ','.join(row) + '\n'
file.write(line)
说明:join() 方法用于将列表中的元素连接成一个字符串,中间以逗号分隔。每行的末尾需要添加换行符 \n。
读取CSV文件
当使用 open() 函数读取 CSV 文件时,你需要手动处理文件内容的解析,将每行的内容按逗号分隔,并处理不同的数据类型(如字符串、整数、浮点数等)。示例:
# 打开文件并读取内容
with open('demo.csv', 'r', encoding='utf-8') as file:
for line in file:
# 移除行末的换行符并按逗号分割
fields = line.strip().split(',')
print(fields)
说明:strip() 函数用于移除行末的换行符 \n。split(',') 方法用于按逗号分割字符串,将其转换为列表。
显示为:
['姓名', '年龄', '城市']
['张三', '25', '北京']
['Bob', '26', 'New York']
使用内置的csv模块处理csv文件
除此之外,Python提供了强大的工具来处理CSV文件,主要通过内置的csv模块,以及第三方库如pandas,第三方库需要额外安装库。在此,我们关注使用内置的csv模块读写CSV文件。
Python的标准库包含一个名为csv的模块,它提供了用于读写CSV文件的类和函数。下面是使用csv模块处理CSV文件的基本步骤。
1.写入CSV文件
使用csv.writer()来写入CSV文件。示例:
import csv
# 准备数据
header = ['姓名', '年龄', '城市']
data = [
['张三', 25, '北京'],
['李四', 30, '上海'],
['王五', 28, '广州']
]
# 打开(或创建)CSV文件
with open('my_data.csv', mode='w', encoding='utf-8', newline='') as file:
csv_writer = csv.writer(file)
# 写入表头
csv_writer.writerow(header)
# 写入数据
csv_writer.writerows(data)
解释:
open()函数用于处理文件,mode='w'表示以写模式打开文件,newline=''防止写入时出现多余的空行(尤其在Windows系统上)。
csv.writer(file)创建一个CSV写入器对象。
csv_writer.writerow(header)写入一行数据。
csv_writer.writerows(data)批量写入多行数据。
2.读取CSV文件
使用csv.reader()来读取CSV文件,将文件内容逐行读取为Python的列表(List)。示例:
import csv
# 打开CSV文件
with open('my_data.csv', mode='r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
# 获取表头(可选)
header = next(csv_reader)
print("Header:", header)
# 逐行读取CSV文件内容
for row in csv_reader:
print(row)
解释:
open()函数用于处理文件,mode='r'表示以读模式打开文件,encoding='utf-8'用于指定编码格式(防止读取中文等非ASCII字符时出现问题)。
csv.reader(file)创建一个CSV读取器对象。
next(csv_reader)读取第一行数据,通常是表头。
通过循环for row in csv_reader来逐行读取剩余的数据。
3.使用csv.DictWriter和csv.DictReader
csv.DictWriter 和 csv.DictReader 是 Python csv 模块中的两个类,专门用于将 CSV 文件与 Python 字典(dict)相互转换。
csv.DictWriter 用于将字典对象写入 CSV 文件。你可以指定表头(即字典的键),然后将多行字典数据写入文件。
使用步骤:
打开或创建 CSV 文件。
创建一个 csv.DictWriter 对象,指定文件和表头。
使用 writeheader() 方法写入表头(可选)。
使用 writerow() 或 writerows() 方法写入一行或多行数据。
示例如下:
import csv
header = ['姓名', '年龄', '城市']
data = [
{'姓名': '张三', '年龄': 25, '城市': '北京'},
{'姓名': '李四', '年龄': 30, '城市': '上海'},
{'姓名': '王五', '年龄': 28, '城市': '广州'}
]
with open('my_dict.csv', mode='w', encoding='utf-8', newline='') as file:
csv_writer = csv.DictWriter(file, fieldnames=header)
# 写入表头
csv_writer.writeheader()
# 写入数据
csv_writer.writerows(data)
csv.DictReader 用于读取 CSV 文件,将文件中的每一行转换为字典对象。字典的键来自 CSV 文件的表头(即第一行的列名),而对应的值则是每一行的数据。使用步骤:
打开 CSV 文件。
创建一个 csv.DictReader 对象。
迭代这个对象,每次循环获取一行数据,返回的是一个字典。
示例如下:
import csv
with open('my_dict.csv', mode='r', encoding='utf-8') as file:
csv_reader = csv.DictReader(file)
# 逐行读取数据为字典
for row in csv_reader:
print(row)