目录
编辑
1. 文件的基础操作
1.1 打开/关闭文件
编辑
示例代码
文件对象
使用with语句打开文件
2. 读文件
2.1 使用read方法读取文件
2.2 使用readline方法读取文件
2.3 使用readlines方法读取文件
2.4 使用for循环读取文件
3. 写文件
3.1 使用write方法写文件
3.2 使用writelines方法写文件
3.3 关于读写缓冲区
4. 操作文件指针
4.1 使用seek方法操作文件指针
4.2 使用tell方法获取文件指针位置
4.3 示例:随机访问文件内容
5. 文件对象内建属性与上下文管理器
5.1 文件对象的内建属性
5.2 使用上下文管理器打开文件
5.3 自定义上下文管理器
6. 文件系统的基础操作
6.1 文件路径操作
6.2 常用文件系统操作
创建文件
删除文件
创建目录
删除目录
遍历目录
6.3 使用os.walk函数递归遍历目录
6.4 代码示例:用Python生成一个Python的Hello World文件并执行
6.5 代码示例:实现ls命令
6.6 代码示例:遍历目录中的所有目录和文件
总结
1. 文件的基础操作
2. 读文件
3. 写文件
4. 操作文件指针
5. 文件对象内建属性与上下文管理器
6. 文件系统的基础操作
专栏:python学习笔记
上一篇:python字典详解
1. 文件的基础操作
1.1 打开/关闭文件
在Python中,使用内置函数open
可以打开一个指定路径下的文件,并返回一个文件对象。常用的打开方式有:
'r'
:读(默认)'w'
:写'a'
:追加写'b'
:二进制模式
open
函数的第一个参数是文件名,可以是相对路径或者绝对路径,第二个参数是打开方式。以下是各种打开方式的详细解释:
'r'
:以只读模式打开文件。文件指针将会放在文件的开头。这是默认模式,如果文件不存在,则会抛出FileNotFoundError
。'w'
:以写模式打开文件。如果文件已存在,则会覆盖原文件。如果文件不存在,则会创建新文件。'a'
:以追加模式打开文件。文件指针将会放在文件的末尾。如果文件不存在,则会创建新文件。'b'
:以二进制模式打开文件。此模式用于读写二进制文件,如图片、视频等。可以与其他模式结合使用,如'rb'
、'wb'
、'ab'
等。
示例代码
以下是一个简单的示例,演示如何打开和关闭文件:
# 打开文件以读取模式
file = open('example.txt', 'r')# 关闭文件
file.close()
分析: 在上面的示例中,我们使用open
函数以读取模式打开了一个名为example.txt
的文件。完成操作后,我们使用close
方法关闭文件。这是一个良好的实践,因为每个打开的文件都会占用系统资源。
但是,如果文件不存在,会发生什么呢?:
try:file = open('non_existent_file.txt', 'r')file.close()
except FileNotFoundError:print("文件不存在")
分析: 上述代码尝试打开一个不存在的文件。由于文件不存在,open
函数会抛出FileNotFoundError
异常。我们使用try-except
块捕获并处理该异常,以避免程序崩溃。
文件对象
在Python中,文件对象不仅包含了文件描述符,还包含了文件的一些其他属性。文件描述符是一个整数,它唯一标识一个打开的文件。操作系统通过文件描述符进行文件操作。
文件对象支持的方法:
read(size=-1)
:从文件读取指定数量的字节。如果未指定size
,则读取整个文件。readline(size=-1)
:读取文件的一行。如果指定了size
,则最多读取size
个字节。readlines(hint=-1)
:读取文件的所有行并返回一个列表。如果指定了hint
,则返回总字节数不超过hint
的行。write(string)
:将字符串写入文件。writelines(lines)
:将字符串列表写入文件。close()
:关闭文件。
使用with
语句打开文件
为了简化文件操作并确保文件在使用完毕后自动关闭,Python引入了上下文管理器,这使得可以使用with
语句来打开文件。with
语句会自动管理文件的打开和关闭操作。
示例代码:
with open('example.txt', 'r') as file:content = file.read()print(content)
遇到的错误是由于Python默认使用的编码格式与文件的实际编码格式不匹配。可以通过显式指定文件的编码格式来解决这个问题。如果不确定文件的编码格式,可以尝试使用常见的编码格式,比如UTF-8。
文件的编码格式有很多,常见的包括以下几种:
- UTF-8(Unicode Transformation Format - 8-bit):是一种可变长度字符编码,能表示所有Unicode字符,是目前最常用的编码格式。
- UTF-16(Unicode Transformation Format - 16-bit):也是一种Unicode字符编码格式,使用16位及以上编码字符,适合需要支持所有Unicode字符的大型文本。
- UTF-32(Unicode Transformation Format - 32-bit):每个字符固定使用32位进行编码,简化了字符处理过程,但文件会更大。
- ASCII(American Standard Code for Information Interchange):早期的字符编码标准,只包含128个字符,用7位或8位编码,适合英文文本。
- ISO-8859-1(Latin-1):是一种单字节字符编码,支持西欧语言,用8位编码。
- GBK(扩展国标):是中文字符集,兼容GB2312,扩展支持更多汉字及符号。
- GB2312:早期的中文字符集标准,只包含部分常用汉字和符号。
- BIG5:是台湾和香港地区使用的中文编码标准,与GBK类似。
你可以根据文件的实际编码选择合适的编码格式。在Python中,可以通过指定encoding
参数来设置文件的编码格式。
下面是修改后的代码:
with open('example.txt', 'r', encoding='utf-8') as file:content = file.read()print(content)
分析: 在这个示例中,with
语句块内的所有操作都可以使用file
对象进行。当with
语句块结束时,文件会自动关闭。这种方式不仅简洁,而且可以确保文件总是被正确关闭,即使在出现异常时也是如此。
小李的理解: 文件操作时要记得关闭文件,不然会占用资源。用with
语句可以自动帮你关掉文件,不用担心忘记关。
2. 读文件
读文件是文件操作中最常见的任务之一。Python提供了多种方法来读取文件内容,包括read
、readline
和readlines
。
2.1 使用read
方法读取文件
read
方法用于读取指定长度的字节数,并返回一个字符串。如果未指定size
,则读取整个文件。该方法适用于读取较小的文件,因为它会将文件内容一次性加载到内存中。
示例代码:
with open('example.txt', 'r', encoding='utf-8') as file:content = file.read()print(content)
分析: 在这个示例中,使用read
方法读取了整个文件的内容,并将其打印出来。
2.2 使用readline
方法读取文件
readline
方法用于读取文件的一行,并返回一个字符串。每次调用该方法,文件指针都会向下移动一行,直到文件末尾。
若example.txt 有两行
示例代码:
with open('example.txt', 'r', encoding='utf-8') as file:line = file.readline()while line:print(line, end='')line = file.readline()
分析: 在这个示例中,使用readline
方法逐行读取文件,并将每一行打印出来。end=''
参数用于避免在每行末尾添加额外的换行符,因为readline
方法已经保留了行末的换行符。
2.3 使用readlines
方法读取文件
readlines
方法用于读取文件的所有行,并返回一个列表。列表中的每个元素都是文件的一行。
示例代码:
with open('example.txt', 'r', encoding='utf-8') as file:lines = file.readlines()for line in lines:print(line, end='')
分析: 在这个示例中,使用readlines
方法读取了文件的所有行,并将每一行打印出来。
2.4 使用for
循环读取文件
除了上述方法,还可以直接使用for
循环遍历文件对象。每次迭代都会返回文件的一行,这种方法在处理大文件时非常高效。
示例代码:
with open('example.txt', 'r', encoding='utf-8') as file:for line in file:print(line, end='')
分析: 在这个示例中,使用for
循环逐行读取文件,并将每一行打印出来。
小李的理解: 读文件有很多方法,read
一次读完,readline
一行行读,readlines
全部读成列表,for
循环更省内存。记住看需求选方法。
3. 写文件
写文件是文件操作中的另一个重要任务。Python提供了write
和writelines
方法来将数据写入文件。
3.1 使用write
方法写文件
write
方法用于向文件中写入一个字符串。如果文件以写模式('w'
)打开,则会覆盖文件的内容。如果文件以追加模式('a'
)打开,则会在文件末尾追加内容。
示例代码:
with open('output.txt', 'w') as file:file.write('Hello, World!\n')file.write('小李很执着\n')
分析: 在这个示例中,使用write
方法向文件中写入了两行文本。每次写入操作都需要显式添加换行符(\n
)。
3.2 使用writelines
方法写文件
writelines
方法用于向文件中写入一个字符串列表。列表中的每个元素都将作为文件的一行写入。
示例代码:
lines = ['第一行文本\n', '第二行文本\n', '第三行文本\n']
with open('output.txt', 'w') as file:file.writelines(lines)
分析: 在这个示例中,使用writelines
方法向文件中写入了一个字符串列表。需要注意的是,writelines
方法不会自动添加换行符,因此我们需要在每个字符串末尾手动添加换行符。
3.3 关于读写缓冲区
在读写文件时,Python提供了缓冲区机制,以提高文件操作的性能。在使用open
函数时,可以通过第三个参数来指定缓冲区大小。
示例代码:
with open('output.txt', 'w', buffering=2048) as file:file.write('使用缓冲区写入数据。\n')
分析: 在这个示例中,指定了缓冲区大小为2048字节。缓冲区机制可以减少I/O操作的频率,从而提高性能。可以使用flush
方法手动刷新缓冲区,将数据写入文件。
示例代码:
with open('output.txt', 'w', buffering=2048) as file:file.write('使用缓冲区写入数据。\n')file.flush()
分析: 在这个示例中,在写入数据后调用flush
方法,将缓冲区中的数据立即写入文件。
小李的理解: 写文件要加换行符,不然会连在一起。缓冲区像个临时储物柜,可以提高速度。用flush
可以马上把数据存到文件里。
4. 操作文件指针
文件指针用于指示当前文件操作的位置。在读写文件时,可以通过文件指针来实现随机访问。Python提供了seek
和tell
方法来操作文件指针。
4.1 使用seek
方法操作文件指针
seek
方法用于将文件指针移动到指定位置。seek
方法有两个参数:
offset
:表示偏移量。whence
:表示偏移量的起始位置。可选值为:
0
:从文件开头计算(默认)。1
:从当前位置计算。2
:从文件末尾计算。
示例代码:
with open('example.txt', 'r') as file:file.seek(10, 0)content = file.read()print(content)
分析: 在这个示例中,使用seek
方法将文件指针移动到文件开头的第10个字节处,然后读取文件内容并打印。
4.2 使用tell
方法获取文件指针位置
tell
方法用于获取当前文件指针的位置,返回值是文件指针到文件开头的偏移量(以字节为单位)。
示例代码:
with open('example.txt', 'r', encoding='gbk') as file:file.seek(10, 0)position = file.tell()print(f"文件指针位置:{position}")
分析: 在这个示例中,使用seek
方法将文件指针移动到文件开头的第10个字节处,然后使用tell
方法获取当前文件指针的位置并打印。
4.3 示例:随机访问文件内容
通过结合使用seek
和tell
方法,可以实现文件的随机访问。例如,我们可以实现一个功能,从文件的任意位置读取特定长度的内容。
示例代码:
def read_from_position(file_path, position, length):with open(file_path, 'r', encoding='utf-8') as file:file.seek(position, 0)content = file.read(length)return contentfile_path = 'example.txt'
position = 10
length = 20content = read_from_position(file_path, position, length)
print(f"从位置{position}读取的内容:{content}")
分析: 在这个示例中,定义了一个函数read_from_position
,用于从指定位置读取特定长度的内容。我们通过传入文件路径、读取位置和读取长度来调用该函数,并打印读取到的内容。
小李的理解: 文件指针像磁带播放器的磁头,可以定位到文件的任意位置开始读写。seek
是移动指针,tell
是告诉你指针的位置。
5. 文件对象内建属性与上下文管理器
文件对象除了支持基本的读写操作外,还提供了一些内建属性和方法。此外,Python引入了上下文管理器,使得文件操作更加简洁和安全。
5.1 文件对象的内建属性
文件对象具有以下常用属性:
name
:文件的名称。mode
:文件的打开模式。closed
:文件是否已关闭。
示例代码:
with open('example.txt', 'r') as file:print(f"文件名:{file.name}")print(f"打开模式:{file.mode}")print(f"是否关闭:{file.closed}")
分析: 在这个示例中,使用文件对象的属性获取文件的名称、打开模式以及文件是否已关闭。
5.2 使用上下文管理器打开文件
上下文管理器通过with
语句来管理资源的打开和关闭。在文件操作中,使用上下文管理器可以确保文件在操作完成后自动关闭,即使在发生异常时也是如此。
示例代码:
with open('example.txt', 'r') as file:content = file.read()print(content)
分析: 在这个示例中,使用with
语句打开文件,并在语句块内读取文件内容。当with
语句块结束时,文件会自动关闭。
5.3 自定义上下文管理器
除了内置的文件对象,Python还允许我们自定义上下文管理器。要创建一个自定义上下文管理器,需要实现__enter__
和__exit__
方法。
示例代码:
class CustomFile:def __init__(self, file_name, mode):self.file_name = file_nameself.mode = modedef __enter__(self):self.file = open(self.file_name, self.mode)return self.filedef __exit__(self, exc_type, exc_val, exc_tb):self.file.close()with CustomFile('example.txt', 'r') as file:content = file.read()print(content)
分析: 在这个示例中,定义了一个自定义上下文管理器CustomFile
,并实现了__enter__
和__exit__
方法。在__enter__
方法中打开文件,并返回文件对象。在__exit__
方法中关闭文件。这样,我们就可以使用with
语句来管理文件操作了。
小李的理解: 文件对象有一些属性可以方便查询。用with
语句打开文件,文件会自动关闭,不用担心忘记关。如果要管理更多资源,可以自定义上下文管理器。
6. 文件系统的基础操作
除了基本的文件读写操作,Python还提供了对文件系统进行操作的功能,包括文件路径操作和常用文件系统操作。
6.1 文件路径操作
使用os.path
模块可以方便地进行文件路径操作。该模块提供了许多实用的函数来处理文件路径。
示例代码:
import os.path# 获取文件名
file_name = os.path.basename('/home/user/example.txt')
print(f"文件名:{file_name}")# 获取目录路径
dir_name = os.path.dirname('/home/user/example.txt')
print(f"目录路径:{dir_name}")# 分割路径
path, file = os.path.split('/home/user/example.txt')
print(f"路径:{path}, 文件:{file}")# 分离文件名和扩展名
name, ext = os.path.splitext('/home/user/example.txt')
print(f"文件名:{name}, 扩展名:{ext}")
分析: 在这个示例中,使用os.path
模块的函数来获取文件名、目录路径、分割路径以及分离文件名和扩展名。
6.2 常用文件系统操作
使用os
模块可以进行文件和目录的操作,如创建文件、删除文件、遍历目录等。
创建文件
使用open
函数可以创建文件。如果文件不存在,open
函数会自动创建新文件。
示例代码:
with open('new_file.txt', 'w') as file:file.write('这是一个新文件。')
分析: 在这个示例中,使用open
函数创建了一个名为new_file.txt
的新文件,并向其中写入了一段文本。
删除文件
使用os.remove
函数可以删除文件。此函数接受一个文件路径作为参数,如果文件不存在,则会引发FileNotFoundError
异常。
示例代码:
import osfile_path = 'new_file.txt'# 检查文件是否存在
if os.path.exists(file_path):os.remove(file_path)print(f"文件 {file_path} 已删除")
else:print(f"文件 {file_path} 不存在")
分析: 在这个示例中,首先检查文件是否存在,然后调用os.remove
函数删除文件。
创建目录
使用os.mkdir
函数可以创建目录。此函数接受一个目录路径作为参数。如果目录已存在,则会引发FileExistsError
异常。
示例代码:
import osdir_path = 'new_directory'# 创建新目录
if not os.path.exists(dir_path):os.mkdir(dir_path)print(f"目录 {dir_path} 已创建")
else:print(f"目录 {dir_path} 已存在")
分析: 在这个示例中,首先检查目录是否存在,然后调用os.mkdir
函数创建目录。
删除目录
使用os.rmdir
函数可以删除空目录。此函数接受一个目录路径作为参数。如果目录不为空,则会引发OSError
异常。
示例代码:
import osdir_path = 'new_directory'# 删除目录
if os.path.exists(dir_path) and os.path.isdir(dir_path):os.rmdir(dir_path)print(f"目录 {dir_path} 已删除")
else:print(f"目录 {dir_path} 不存在或不是目录")
分析: 在这个示例中,首先检查目录是否存在并且是否为目录,然后调用os.rmdir
函数删除目录。
遍历目录
使用os.listdir
函数可以列出指定目录中的所有文件和目录。此函数接受一个目录路径作为参数,返回该目录中的所有文件和目录名的列表。
示例代码:
import osdir_path = '.'# 列出目录中的所有文件和目录
entries = os.listdir(dir_path)
for entry in entries:print(entry)
分析: 在这个示例中,使用os.listdir
函数列出了当前目录中的所有文件和目录。
6.3 使用os.walk
函数递归遍历目录
os.walk
函数可以递归遍历目录树,生成一个包含目录路径、目录名列表和文件名列表的三元组。
import osdir_path = '.'# 递归遍历目录
for root, dirs, files in os.walk(dir_path):print(f"目录路径: {root}")print(f"目录名列表: {dirs}")print(f"文件名列表: {files}")print('-----')
分析: 在这个示例中,使用os.walk
函数递归遍历当前目录及其子目录,并打印每个目录的路径、目录名列表和文件名列表。
6.4 代码示例:用Python生成一个Python的Hello World文件并执行
可以使用os
模块创建一个Python脚本文件,并使用os.system
函数执行该脚本。
示例代码:
import osfile_name = 'hello.py'# 创建并写入Python脚本
with open(file_name, 'w') as file:file.write('#!/usr/bin/python\n')file.write('print("Hello, World!")\n')# 设置脚本为可执行
os.chmod(file_name, 0o755)# 执行Python脚本
os.system(f'./{file_name}')
分析: 在这个示例中,我们首先创建一个名为hello.py
的Python脚本文件,并向其中写入Hello, World!
打印语句。然后,我们使用os.chmod
函数设置文件为可执行,最后使用os.system
函数执行该脚本。
6.5 代码示例:实现ls命令
可以使用os
模块实现类似ls
命令的功能,列出指定目录中的所有文件和目录。
示例代码:
import os
import sys# 获取命令行参数中的目录路径
dir_path = sys.argv[1] if len(sys.argv) > 1 else '.'# 列出目录中的所有文件和目录
for entry in os.listdir(dir_path):print(entry)
分析: 在这个示例中,从命令行参数中获取目录路径,并使用os.listdir
函数列出该目录中的所有文件和目录。如果未提供目录路径,则默认列出当前目录。
6.6 代码示例:遍历目录中的所有目录和文件
我们可以使用os.walk
函数递归遍历目录中的所有目录和文件,并打印每个文件的完整路径。
示例代码:
import os
import sys# 获取命令行参数中的目录路径
dir_path = sys.argv[1] if len(sys.argv) > 1 else '.'# 递归遍历目录
for root, dirs, files in os.walk(dir_path):for file in files:print(os.path.join(root, file))
分析: 在这个示例中,从命令行参数中获取目录路径,并使用os.walk
函数递归遍历目录中的所有目录和文件,并打印每个文件的完整路径。
小李的理解: os.path
可以帮你处理路径问题,比如获取文件名和目录。用os
模块可以做很多文件和目录的操作,比如创建和删除文件、遍历目录。os.walk
可以递归遍历目录,非常强大。
总结
在现代编程环境中,掌握文件操作技能对于开发者来说至关重要。Python作为一种高效、简洁的编程语言,提供了强大的文件操作功能。文件的基本操作、读写文件、文件指针的操作以及文件系统的操作。
1. 文件的基础操作
文件的基础操作是Python文件处理的核心部分。通过使用内置函数open
和close
,我们可以打开和关闭文件,并确保系统资源的有效利用。使用with
语句可以简化文件操作,并确保文件在使用完毕后自动关闭,从而避免资源泄漏。
2. 读文件
Python提供了多种方法来读取文件内容,包括read
、readline
和readlines
。每种方法都有其独特的适用场景和优势。通过掌握这些方法,我们可以根据具体需求选择最合适的文件读取方式,确保代码的高效性和可维护性。
3. 写文件
写文件是文件操作中的另一个重要任务。Python的write
和writelines
方法提供了灵活的写入方式。结合使用读写缓冲区,可以进一步提高文件操作的性能。掌握这些写文件的方法,将使您能够高效地处理文件写入任务。
4. 操作文件指针
文件指针操作使我们能够实现文件的随机访问。通过seek
和tell
方法,我们可以灵活地控制文件指针的位置,从而实现高效的文件读取和写入。文件指针操作在处理大文件时尤为重要,因为它允许我们在不读取整个文件的情况下访问特定部分的数据。
5. 文件对象内建属性与上下文管理器
文件对象提供了一些内建属性,帮助我们获取文件的基本信息。此外,Python引入了上下文管理器,使得文件操作更加简洁和安全。通过自定义上下文管理器,我们可以管理更多的资源,进一步提高代码的可读性和可靠性。
6. 文件系统的基础操作
Python的os
和os.path
模块提供了丰富的文件系统操作功能,包括文件路径操作、创建和删除文件和目录、遍历目录等。这些功能使我们能够高效地管理文件系统,并实现复杂的文件操作任务。通过掌握这些基础操作,您将能够在各种编程场景中灵活地处理文件系统。
如果您有任何问题或需要进一步的帮助,请随时留言讨论。Happy coding!