亲爱的亦菲彦祖们,大家好!在编程的世界里,文件操作是一项基本而重要的技能。无论是读取数据、存储信息,还是管理文件和文件夹,掌握文件操作都能大大提升你的编程效率。今天,我们将一起深入探讨Python中的文件操作,内容将通俗易懂且详细,希望能帮助你们更好地理解和应用这些知识。
1. 文件操作的作用
什么是文件?
在计算机中,文件是用来存储数据和信息的基本单位。无论是文本文档、图片、音频,还是程序代码,都以文件的形式存在。通过文件操作,程序可以读取、写入和管理这些文件,从而实现数据的持久化和共享。
文件操作包含什么?
文件操作主要包括以下几个方面:
- 打开文件:指定要操作的文件。
- 读写文件:从文件中读取数据或向文件中写入数据。
- 关闭文件:结束对文件的操作,释放资源。
- 复制文件、删除文件等其他操作。
文件操作的作用是什么?
文件操作的主要作用包括:
- 读取内容:从文件中获取数据。
- 写入内容:将数据保存到文件中。
- 备份内容:复制文件以防数据丢失。
- 管理文件和文件夹:创建、删除、重命名等操作。
总结:文件操作的作用就是将数据存储在文件中,便于程序在下次执行时直接使用这些数据,而无需重新生成,既省时又省力。
2. 文件的基本操作
2.1 文件操作步骤
进行文件操作通常遵循以下步骤:
- 打开文件:指定要操作的文件及其模式(如只读、写入等)。
- 读写操作:根据需要读取文件内容或向文件写入数据。
- 关闭文件:结束文件操作,释放资源。
注意:即使不进行读写操作,也应及时关闭文件,以防数据泄露或资源占用。
2.2 打开文件
在Python中,使用open
函数可以打开一个已存在的文件或创建一个新文件。其基本语法如下:
open(name, mode)
name
:要打开的目标文件名的字符串(可以包含文件的具体路径)。mode
:设置打开文件的模式(访问模式),如只读、写入、追加等。
打开文件模式
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在,原有内容将被删除;如果文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。行为同w 模式。 |
w+ | 打开一个文件用于读写。如果该文件已存在,原有内容将被删除;如果文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。行为同w+ 模式。 |
a | 打开一个文件用于追加。如果文件已存在,文件指针将放在文件结尾,新的内容将被写入;如果文件不存在,创建新文件。 |
ab | 以二进制格式打开一个文件用于追加。行为同a 模式。 |
a+ | 打开一个文件用于读写。如果文件已存在,文件指针将放在文件结尾;如果文件不存在,创建新文件。 |
ab+ | 以二进制格式打开一个文件用于追加。行为同a+ 模式。 |
快速体验
f = open('test.txt', 'w')
注意:此时的
f
是open
函数返回的文件对象,可以通过它进行后续的读写操作。
2.3 文件对象方法
写操作
-
语法
文件对象.write('内容')
-
示例
# 1. 打开文件 f = open('test.txt', 'w') # 2. 文件写入 f.write('hello world') # 3. 关闭文件 f.close()
注意:
- 使用
w
模式和a
模式:如果文件不存在,将创建新文件;如果文件存在,w
模式会先清空文件再写入,a
模式则直接在文件末尾追加内容。 - 使用
r
模式:如果文件不存在,将报错。
- 使用
读操作
-
read()
文件对象.read(num)
num
表示要从文件中读取的数据的长度(单位是字节)。如果不传入num
,则读取文件中的所有数据。
-
readlines()
f = open('test.txt') content = f.readlines() # 输出示例 ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc'] print(content) # 关闭文件 f.close()
readlines()
会按照行的方式一次性读取整个文件的内容,并返回一个列表,其中每一行的数据为一个元素。 -
readline()
f = open('test.txt') content = f.readline() print(f'第一行:{content}') content = f.readline() print(f'第二行:{content}') # 关闭文件 f.close()
readline()
一次读取一行内容。
2.4 关闭文件
文件对象.close()
关闭文件后,文件指针将不再指向该文件,释放系统资源。
2.5 使用with管理文件上下文
上述文件操作需要手动打开和关闭文件,较为麻烦。使用with
语句可以自动管理文件上下文,确保文件在操作完成后自动关闭。
with open('test.txt', mode='r', encoding='utf-8') as f:
text = f.read()
print(text)
优点:
- 自动管理文件的打开和关闭,避免忘记关闭文件。
- 代码更加简洁。
3. 文件夹及目录操作——OS模块
在日常使用计算机时,经常需要列出文件夹的内容、创建或删除文件和文件夹。Python提供了os
模块,可以轻松实现这些操作。
3.1 OS目录操作
方法 | 说明 |
---|---|
os.mkdir | 创建目录 |
os.rmdir | 删除目录 |
os.rename | 重命名文件或目录 |
os.remove | 删除文件 |
os.getcwd | 获取当前工作路径 |
os.chdir | 修改当前工作目录 |
os.mkdir
创建一个新目录。
import os
os.mkdir('new_folder')
os.rmdir
删除一个空目录。
import os
os.rmdir('new_folder')
os.rename
重命名文件或目录。
import os
os.rename('old_name.txt', 'new_name.txt')
注意:如果目标文件不存在,将会报错。
os.remove
删除文件。
import os
os.remove('file_to_delete.txt')
注意:如果文件不存在,将会报错。
os.getcwd
获取当前程序的工作目录。
import os
current_dir = os.getcwd()
print(current_dir) # 例如:'C:\\Users\\Administrator'
os.chdir
改变程序的工作目录。
import os
os.chdir('C:\\')
print(os.getcwd()) # 输出:'C:\\'
3.2 OS路径操作
os.path
模块提供了许多跨平台的路径操作方法,使用这些方法可以编写更具兼容性的代码。
常用方法
方法 | 说明 |
---|---|
os.path.join | 连接目录与文件名 |
os.path.split | 分割文件名与目录 |
os.path.abspath | 获取绝对路径 |
os.path.dirname | 获取路径 |
os.path.basename | 获取文件名或文件夹名 |
os.path.splitext | 分离文件名与扩展名 |
os.path.isfile | 判断路径是否是一个文件 |
os.path.isdir | 判断路径是否是一个目录 |
os.path.exists | 检查文件或目录是否存在 |
示例
import os
# 获取当前工作目录
print(os.getcwd()) # 输出:'C:\\Users\\Administrator'
# 获取文件的绝对路径
print(os.path.abspath('hello.py')) # 输出:'C:\\Users\\Administrator\\hello.py'
# 分离目录与文件名
print(os.path.split(os.path.abspath('.'))) # 输出:('C:\\Users', 'Administrator')
# 连接目录与文件名
print(os.path.join('C:\\Users', 'Administrator')) # 输出:'C:\\Users\\Administrator'
# 分离文件名与扩展名
print(os.path.splitext('filename.txt')) # 输出:('filename', '.txt')
检查路径
import os
# 获取文件或文件夹的路径
print(os.path.dirname('C:\\Users\\Administrator\\hello.py')) # 输出:'C:\\Users\\Administrator'
# 获取文件名或文件夹名
print(os.path.basename('C:\\Users\\Administrator\\hello.py')) # 输出:'hello.py'
# 判断路径是否是文件
print(os.path.isfile('C:\\Users\\Administrator\\hello.py')) # 输出:True
# 判断路径是否是目录
print(os.path.isdir('C:\\Users\\Administrator')) # 输出:True
案例一:显示当前目录中所有的文件
import os
current_dir = os.getcwd()
files = [f for f in os.listdir(current_dir) if os.path.isfile(os.path.join(current_dir, f))]
print("当前目录中的文件有:")
for file in files:
print(file)
案例二:给所有的txt
文件前加上前缀[前缀]
import os
def add_prefix_to_txt_files(folder_path, prefix):
for filename in os.listdir(folder_path):
if filename.endswith('.txt'):
new_name = f"[{prefix}]{filename}"
os.rename(os.path.join(folder_path, filename), os.path.join(folder_path, new_name))
print("前缀添加完成。")
# 使用示例
add_prefix_to_txt_files('test_folder', '前缀')
4. 拓展:深浅拷贝
在Python中,对象的赋值和拷贝(深拷贝与浅拷贝)之间存在差异。如果不注意,可能会导致意外的结果。这主要是由于对象在内存中的引用关系所导致。
对象引用、浅拷贝、深拷贝
使用=
赋值(对象引用)
=
赋值:数据完全共享
使用=
进行赋值时,两个变量指向同一个对象。如果对象是可变的(如列表),修改其中一个变量会影响另一个变量。
a = [1, 2, 3]
b = a
a[0] = 'surprise'
print(a) # 输出:['surprise', 2, 3]
print(b) # 输出:['surprise', 2, 3]
浅拷贝(copy
)
浅拷贝:数据半共享
浅拷贝会创建一个新的对象,但对于嵌套的子对象,仅复制了引用。即,如果子对象是可变的,修改子对象会影响到拷贝后的对象。
import copy
a = [1, 2, 3]
b = a.copy()
c = list(a)
d = a[:]
a[0] = 'integer lists are boring'
print(a) # 输出:['integer lists are boring', 2, 3]
print(b) # 输出:[1, 2, 3]
print(c) # 输出:[1, 2, 3]
print(d) # 输出:[1, 2, 3]
对于嵌套对象:
import copy
a = [1, 2, 3, [4, 5, 6]]
b = copy.copy(a)
a[3][0] = "surprises"
print(b) # 输出:[1, 2, 3, ['surprises', 5, 6]]
深拷贝(deepcopy
)
深拷贝:数据完全不共享
深拷贝会递归地复制所有层级的对象,确保拷贝后的对象与原对象完全独立,互不影响。
import copy
a = [1, 2, 3, [4, 5, 6]]
b = copy.deepcopy(a)
a[3][0] = "surprises"
print(b) # 输出:[1, 2, 3, [4, 5, 6]]
总结:
copy.copy
:浅拷贝,仅拷贝父对象,不会拷贝子对象。copy.deepcopy
:深拷贝,递归拷贝父对象及其所有子对象。
5. 练习题
亲爱的亦菲彦祖们,通过以下练习来巩固今天学习的内容吧!
练习1:文件读写
-
创建一个名为
sample.txt
的文件,并写入以下内容:Hello, Python! Welcome to file operations.
-
使用Python读取
sample.txt
的内容并打印出来。 -
在
sample.txt
的末尾追加一行:This is an appended line.
练习2:目录操作
-
在当前工作目录下创建一个名为
test_dir
的文件夹。 -
在
test_dir
中创建一个名为test_file.txt
的文件,并写入一些内容。 -
重命名
test_file.txt
为renamed_file.txt
。 -
列出
test_dir
中所有的文件。 -
删除
renamed_file.txt
和test_dir
文件夹。
练习3:深浅拷贝
-
创建一个包含嵌套列表的列表,例如:
original = [1, 2, [3, 4]]
-
使用浅拷贝和深拷贝分别创建两个新的列表。
-
修改原列表中的嵌套列表元素,观察浅拷贝和深拷贝后的列表变化。
6. 总结
今天,我们全面探讨了Python中的文件操作,包括:
- 文件操作的作用:理解文件在数据存储和管理中的重要性。
- 文件的基本操作:掌握打开、读写、关闭文件的基本步骤和方法。
- OS模块的使用:学习如何通过
os
模块进行目录和路径的管理。 - 深浅拷贝:了解对象赋值、浅拷贝与深拷贝的区别,避免潜在的编程错误。
掌握这些知识,亦菲彦祖们将在编程的道路上更加游刃有余。希望通过这篇博客,你们能对Python的文件操作有更深入的理解和应用。记得多练习哦,实践是学习编程最好的方式!
祝学习愉快!