文件概述
在程序运行时,数据通常被加载到内存中以便快速处理。然而,内存中的数据在断电后会丢失,无法永久保存。为了永久存储数据,我们需要将数据保存到文件或数据库中。因此,掌握文件处理对于编程至关重要。
文件是数据的集合,可以存储多种类型的数据,包括文字、图片、音乐、视频等。
文本文件
文本文件由若干字符构成,可以使用文本编辑器进行阅读或编辑。常见的文本文件后缀包括 .txt、.c、.py 等。
二进制文件
二进制文件无法直接使用文本编辑器打开阅读或编辑,需要通过特定的软件才能打开或修改。常见的二进制文件后缀包括 mp3、mp4、png 等。从本质上讲,文本文件也是二进制文件的一种表现形式,因为计算机处理的所有数据都是以二进制形式存储的。
文件操作
文件操作主要包括三个步骤:打开文件、读或写数据、关闭文件。
打开文件
使用 open() 函数打开文件,其语法格式如下:
python复制代码
open(file[, mode = 'r' [,...] ])
- file:被打开的文件名。
- mode:文件的打开模式,默认为只读模式 'r'。
常用的文件打开模式包括:
- 'r':只读模式,如果文件不存在,则会产生异常。
- 'r+':读写模式,如果文件不存在,则会产生异常。
- 'w':写入模式,如果文件已存在,则删除原内容;如果文件不存在,则新建文件。
- 'w+':读写模式,功能与 'w' 相同,但允许读取。
- 'a':追加模式,如果文件已存在,则在文件末尾追加内容;如果文件不存在,则新建文件。
- 'a+':读写追加模式,功能与 'a' 相同,但允许读取。
- 'rb+'、'wb+'、'ab+':分别对应二进制文件的读写、读写新建、读写追加模式。
示例代码:
python复制代码
f1 = open('test.txt', mode="r", encoding="utf-8") # 打开当前目录下的test.txt文件
f2 = open('../test.txt') # 打开上级目录下的test.txt文件
f3 = open('D:/python/test.txt') # 打开D:/python目录下的test.txt文件
读取和写入数据
打开文件后,可以通过文件对象进行读取和写入操作。具体方法取决于文件的打开模式。
- 读取文件内容通常使用 read()、readline() 或 readlines() 方法。
- 写入文件内容则使用 write() 方法。
关闭文件
操作完成后,应使用 close() 方法关闭文件,以确保所有修改都被保存并释放系统资源。然而,如果在打开文件后和关闭文件前发生错误,程序可能会崩溃,导致文件无法正常关闭。为了避免这种情况,推荐使用 with 关键字来管理文件的打开和关闭。
python复制代码
with open('test.txt', 'rw') as f1:
# 在这里进行文件操作
# 文件会在with语句块结束时自动关闭
with 语句还可以同时打开多个文件进行操作。
总结
文件操作是编程中不可或缺的一部分,掌握文件打开、读取、写入和关闭的基本方法对于处理数据至关重要。通过合理使用 open() 函数和 with 语句,可以高效地进行文件操作,并确保数据的正确性和安全性。
5. 文件的基本操作
5.1 打开文件
使用open()函数可以打开文件,该函数的基本语法如下:
file_object = open(file_name, mode='r', encoding='utf-8')
- file_name:要打开的文件名。
- mode:文件的打开模式,默认为'r'(只读模式)。常用的模式包括'r'(只读)、'w'(写入,文件不存在则创建,存在则覆盖)、'a'(追加,文件不存在则创建)、'b'(二进制模式,可与其他模式组合使用,如'rb'、'wb')。
- encoding:指定文件的编码方式,默认为'utf-8'。
示例
# 打开当前目录下的test.txt文件,以只读模式
f1 = open('test.txt', 'r', encoding='utf-8')
# 打开上级目录下的test.txt文件,默认模式为只读
f2 = open('../test.txt')
# 打开指定路径下的文件
f3 = open('D:/python/test.txt', 'r', encoding='utf-8')
6. 文件的读取
6.1 read()方法
read()方法用于读取文件内容。可以指定读取的字节数或字符数,如果不指定,则读取整个文件。
file_content = file_object.read([size])
- size(可选):指定读取的字节数或字符数。
示例
with open('test.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
6.2 readline()方法
readline()方法用于逐行读取文件内容。
line = file_object.readline()
- 读取一行内容,直到遇到换行符或文件末尾。
示例
with open('test.txt', 'r', encoding='utf-8') as f:
while True:
line = f.readline()
if not line:
break
print(line, end='') # 保留换行符则不需要end=''
7. 文件的写入与追加
7.1 write()方法
write()方法用于向文件写入内容。如果文件不存在,则创建文件;如果文件已存在且以'w'模式打开,则覆盖原有内容。
file_object.write(str)
- str:要写入的字符串。
示例
with open('test.txt', 'w', encoding='utf-8') as f:
f.write('Hello, Python!\n')
7.2 append()模式
使用'a'模式打开文件时,会向文件末尾追加内容,而不会覆盖原有内容。
with open('test.txt', 'a', encoding='utf-8') as f:
f.write('This is a new line.\n')
8. 文件指针的操作
8.1 tell()方法
tell()方法用于获取当前文件指针的位置(即当前读写位置)。
position = file_object.tell()
示例
with open('test.txt', 'r', encoding='utf-8') as f:
print(f.tell()) # 文件刚开始时,指针在0位置
f.read(5)
print(f.tell()) # 读取5个字节后,指针移动到相应位置
8.2 seek()方法
seek()方法用于移动文件指针到指定位置。
file_object.seek(offset, whence=0)
- offset:要移动的字节数。
- whence(可选):起始位置,默认为0(文件开头),1表示当前位置,2表示文件末尾。
示例
with open('test.txt', 'r', encoding='utf-8') as f:
f.seek(5) # 移动到文件的第5个字节位置
print(f.read()) # 从第5个字节开始读取文件内容
11. 文件的高级操作
11.1 文件的迭代
除了使用readline()和readlines()方法外,Python还允许我们直接迭代文件对象,从而逐行读取文件内容。
with open('test.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line, end='') # 去除额外的换行符
11.2 文件的上下文管理器
使用with语句可以确保文件在使用后正确关闭,这是处理文件时的最佳实践。with语句内部创建了一个上下文管理器,它会在代码块执行完毕后自动调用close()方法。
12. 文件的遍历与搜索
12.1 遍历文件内容
除了逐行遍历外,我们还可以根据特定的模式或条件遍历文件内容,例如使用正则表达式进行搜索。
import re
with open('test.txt', 'r', encoding='utf-8') as f:
pattern = re.compile(r'\bpython\b', re.IGNORECASE)
for line in f:
if pattern.search(line):
print(line, end='')
12.2 搜索特定文件
在文件系统中搜索特定文件通常涉及到遍历目录结构。这可以通过os模块或pathlib模块实现。
13. 目录操作
13.1 获取当前工作目录
使用os.getcwd()函数可以获取当前工作目录的路径。
import os
print(os.getcwd())
13.2 更改当前工作目录
使用os.chdir()函数可以更改当前工作目录。
os.chdir('/path/to/directory')
13.3 列出目录内容
使用os.listdir()函数可以列出指定目录的内容(文件名列表)。
files = os.listdir('.')
print(files)
14. 路径操作
14.1 使用os.path
os.path模块提供了多种函数来处理文件路径。
- os.path.join():跨平台地拼接路径。
- os.path.exists():检查路径是否存在。
- os.path.isdir():检查路径是否为目录。
- os.path.isfile():检查路径是否为文件。
14.2 使用pathlib
pathlib是Python 3.4引入的一个面向对象的文件系统路径操作库,它提供了更直观、更易于理解的路径操作方式。
from pathlib import Path
p = Path('.')
print(p.absolute()) # 绝对路径
print(p.glob('*.txt')) # 匹配当前目录下的所有.txt文件
15. 文件的复制、移动与删除
15.1 复制文件
可以使用shutil模块来复制文件。
import shutil
shutil.copy('source.txt', 'destination.txt')
15.2 移动文件
移动文件可以使用shutil.move()方法。
shutil.move('old_location.txt', 'new_location.txt')
15.3 删除文件
删除文件可以使用os.remove()函数或pathlib.Path.unlink()方法。
os.remove('file_to_delete.txt')
# 或者
p = Path('file_to_delete.txt')
p.unlink()
16. 异常处理
在文件操作中,可能会遇到各种异常,如文件不存在、没有读写权限等。使用try...except语句可以捕获并处理这些异常。
try:
with open('nonexistent_file.txt', 'r') as f:
content = f.read()
except FileNotFoundError:
print("文件不存在!")
except IOError as e:
print(f"读取文件时发生错误:{e}")
except Exception as e:
print(f"发生未知错误:{e}")