一,文件的基本概念
文件的基本概念涉及存储、读取和操作数据的方式。简而言之,文件是计算机中用于保存信息的容器,按一定的格式存储数据,可以是文本、二进制或其他格式。下面是一些关于文件的核心概念:
1. 文件类型
- 文本文件:以字符的形式存储数据,通常用
.txt
、.csv
、.log
等扩展名。可以直接用文本编辑器查看和编辑。 - 二进制文件:以二进制的形式存储数据,通常用
.jpg
、.mp3
、.exe
等扩展名。需要特定的程序才能正确读取和操作。
2. 文件的结构
- 文件头(Header):文件的开头部分,通常包含文件格式的元数据,如版本信息、文件大小等。
- 文件内容:实际存储的数据部分,文本文件是由字符组成,二进制文件是由字节组成。
3. 文件的打开与关闭
- 打开文件:在进行读取或写入之前,必须首先打开文件。打开文件时指定文件路径以及访问模式(例如:只读、写入、追加等)。
- 关闭文件:完成操作后,需要关闭文件,以释放系统资源。在编程语言中,通常通过调用特定的关闭函数来完成此操作。
4. 文件访问模式
文件访问模式是打开文件时指定的选项,决定了我们如何访问文件。常见的模式包括:
- 只读模式 (
r
):只能读取文件内容,不能修改。如果文件不存在,会报错。 - 写入模式 (
w
):创建一个新文件或清空已有文件并写入数据。如果文件已存在,会覆盖原文件。 - 追加模式 (
a
):打开文件进行写入,但不会覆盖原文件内容,而是在文件末尾追加内容。 - 二进制模式 (
b
):用于处理二进制文件,例如rb
或wb
。
5. 文件路径
- 绝对路径:从文件系统根目录开始的完整路径。例如:
/Users/username/Documents/file.txt
。 - 相对路径:相对于当前工作目录的路径。例如:
./file.txt
。
6. 文件操作
常见的文件操作包括:
- 读取文件内容:通过文件的读取函数,获取文件的内容。
- 写入文件内容:将数据写入文件中。
- 删除文件:删除指定的文件。
- 修改文件内容:对文件中的数据进行修改。
7. 文件指针
文件指针指向当前文件操作的位置。每次读取或写入时,文件指针都会根据操作自动移动。可以通过编程语言中的函数手动设置文件指针的位置。
8. 权限与访问控制
文件权限决定了谁可以访问、修改或执行文件。权限通常分为:
- 读取权限(r)
- 写入权限(w)
- 执行权限(x)
9. 文件系统
文件存储在硬盘、固态硬盘或其他存储设备上,操作系统通过文件系统管理文件的存储、读取和权限。常见的文件系统包括 NTFS(Windows)、HFS+(macOS)、ext4(Linux)等。
10. 文件的生命周期
- 创建文件:文件被创建时,可以为空文件或包含初始数据。
- 读取/写入:文件在使用过程中可以被读取或修改。
- 删除文件:文件在不再需要时,可以被删除。
11. 文件压缩与解压
为了节省存储空间或便于传输,文件可以进行压缩(如 .zip
、.tar
、.gz
等)。压缩文件通常包含多个文件,并且存储方式经过优化。
二,python中文件的基本操作
1. 打开文件
使用 open()
函数来打开一个文件:
file = open('file.txt', 'r') # 以读取模式打开文件
open()
函数有两个参数:
- 文件路径(例如:
file.txt
) - 模式(例如:
r
、w
、a
等)
常见的文件打开模式:
打开模式 | 说明 |
---|---|
'r' | 只读模式(read):文件必须存在,打开后只能读取,不能修改。 |
'w' | 写入模式(write):如果文件存在,会覆盖原有内容;如果文件不存在,会创建新文件。 |
'a' | 追加模式(append):如果文件存在,会在文件末尾添加内容;如果文件不存在,会创建新文件。 |
'b' | 二进制模式(binary):以二进制格式打开文件,通常与其他模式一起使用(如 rb 、wb )。 |
'x' | 独占创建模式(exclusive creation):如果文件已存在,会报错;如果文件不存在,会创建新文件。 |
'r+' | 读写模式(read/write):文件必须存在,既可以读取也可以写入,不会覆盖文件内容。 |
'w+' | 读写模式(write/read):如果文件存在,会覆盖原有内容;如果文件不存在,会创建新文件。 |
'a+' | 追加读写模式(append/read):如果文件存在,读取内容并在末尾追加;如果文件不存在,会创建新文件。 |
'rb' | 二进制只读模式(binary read):以二进制模式读取文件,文件必须存在。 |
'wb' | 二进制写入模式(binary write):以二进制模式写入文件,如果文件不存在,会创建新文件;如果文件已存在,会覆盖文件内容。 |
'ab' | 二进制追加模式(binary append):以二进制模式打开文件,如果文件存在,会追加数据;如果文件不存在,会创建新文件。 |
'r+b' | 二进制读写模式(binary read/write):以二进制模式读取和写入文件,文件必须存在。 |
'w+b' | 二进制读写模式(binary write/read):以二进制模式读取和写入文件,如果文件已存在,会覆盖文件内容;如果文件不存在,会创建新文件。 |
'a+b' | 二进制追加读写模式(binary append/read):以二进制模式打开文件,读取并在末尾追加数据;如果文件不存在,会创建新文件。 |
2. 读取文件内容
可以使用 read()
或 readlines()
来读取文件内容。
-
read()
:一次读取文件的所有内容,返回一个字符串。content = file.read()
-
readlines()
:读取文件的所有行,返回一个列表,每个元素为一行。lines = file.readlines()
3. 写入文件内容
可以使用 write()
或 writelines()
来向文件写入内容。
-
write()
:将一个字符串写入文件。file.write("Hello, world!")
-
writelines()
:将一个字符串列表写入文件,每个元素写入一行。file.writelines(['Line 1\n', 'Line 2\n'])
4. 关闭文件
在完成文件操作后,应该关闭文件以释放资源:
file.close()
5. with
语句
with
语句:又称上下文管理器,在处理文件时,无论是否产生异常,都能保证with语句执行完毕后关闭已经打开的文件,这个过程是自动的,无需手动操作。
为了确保文件操作结束后文件能自动关闭,可以使用 with
语句:
with open('file.txt', 'r') as file:content = file.read()
# 文件会在 with 语句块结束后自动关闭
6. 文件指针
文件的读取和写入通常是按顺序进行的,文件指针会记录当前操作的位置。通过 seek()
和 tell()
方法可以手动操作文件指针:
seek(offset, whence)
:设置文件指针的位置。tell()
:返回当前文件指针的位置。
总结:读写方法
读写方法 | 描述说明 |
---|---|
file.read(size) | 从文件中读取size个字符或字节,如果没有给定参数,则读取文件中的全部内容 |
file.readline(size) | 读取文件中的一行数据,如果给定参数,则为读取这一行中的size个字符或字节 |
file.readlines() | 从文件中读取所有内容,结果为列表类型 |
file.write(s) | 将字符串s写入文件 |
file.writelines(lst) | 将内容全部为字符串的列表Ist写入文件 |
file.seek(offset) | 改变当前文件操作指针的位置,英文占一个字节,中文gbk编码占两个字节,utf-8编码占三个字节 |
实例一,文件的读写操作
def my_write():#(1)创建/打开文件file=open('a.txt','w',encoding='utf-8')#(2)操作文件file.write('114514')#(3)关闭文件file.close()#读取文件的函数
def my_read():#(1)打开文件file=open('a.txt','r',encoding='utf-8')#(2)读取文件s=file.read()print(type(s),s)#(3)关闭文件file.close()if __name__ == '__main__':my_write() #调用创建文件内容函数my_read() #调用读取文件内容函数
实例二,文件的写入操作
def my_write(s):#1,打开文件file=open('b.txt','a',encoding='utf-8')#2,写入内容file.write(s)file.write('\n')#3关闭文件file.close()def my_write_list(file,lst):#1,打开文件f=open(file,'a',encoding='utf-8')#2,操作文件f.writelines(lst)#3,关闭文件f.close()if __name__ == '__main__':my_write('123456')my_write('654321')#准备数据lst=['姓名\t','年龄\t','成绩\t','张三\t','30\t','98']my_write_list('c.txt',lst)
实例三,文件读取操作
def my_read(filename):#1,打开file=open(filename,'w+',encoding='utf-8')#2,操作file.write('你好啊') #写入完成,文件的指针在最后#seek,修改文件指针的位置file.seek(0)#读取# s=file.read() #读取全部# s=file.read(2) #2指提取两个字符# s=file.readline() #仅读取一行数据# s=file.readline(2) #仅读取一行数据的前两个字符s=file.readlines() #读取所有,一行为列表中的一个元素,s是列表类型print(type(s),s)#读取好啊file.seek(3) #3表示三个字节,一个中文占三个字节,utf-8s1=file.read() #读取全部print(type(s1),s1)#3,关闭file.close()
if __name__ == '__main__':my_read('d.txt')
实例四,文件复制操作
def copy(src,new_path):#文件的复制操作就是边读边写操作#1,打开源文件file1=open(src,'rb')#2,打开目标文件file2=open(new_path,'wb')#3,开始复制,边读边写s=file1.read() #源文件读取所有file2.write(s) #向目标文件写入所有#4,关闭文件(规律:先打开的后关,后打开的先关)file2.close()file1.close()if __name__ == '__main__':src='./logo.png'new_path='../copy.png' #..表示为上级目录,相当于windows后退copy(src,new_path)print('文件复制完成')
实例五,with语句的使用
def write_fun():with open('aa.txt','w',encoding='utf-8') as file:file.write('2020年一月一日')def read_fun():with open('aa.txt','w',encoding='utf-8') as file:print(file.read())def copy(src_file,target_file):with open(src_file,'r',encoding='utf-8') as file:with open(target_file,'w',encoding='utf-8') as file2:file2.write(file.read()) #将读取的内容直接写进文件if __name__ == '__main__':write_fun()read_fun()#文件复制copy('./aa.txt','./dd.txt')
三,数据的组织维度及存储
在Python中,数据的组织维度通常指的是如何通过不同的数据结构来组织、存储和访问数据。
1. 一维数据(Scalar / List / Array)
通常采用线性方式组织数据,一般使用python中的列表,元组,或者集合进行存储数据
- 标量(Scalar): 这是单一的数值或对象。例如,
x = 5
或name = "John"
。 - 列表(List): 一维的有序集合,可以包含多个元素,支持索引和切片操作。比如,
my_list = [1, 2, 3, 4, 5]
。 - 数组(Array): NumPy库提供的数组通常比Python列表在处理大规模数据时更高效,支持向量化操作。比如,
import numpy as np
和arr = np.array([1, 2, 3, 4, 5])
。
2. 二维数据(Matrix / DataFrame)
二维数据也称表格数据,由行和列组成,类型于Excel表格,在python中使用二维列表进行存储
- 矩阵(Matrix): 可以看作是二维数组,行和列的集合。NumPy的二维数组通常用于这种情况。例如,
matrix = np.array([[1, 2], [3, 4], [5, 6]])
。 - 数据框(DataFrame): Pandas库提供的二维数据结构,具有标签行和列,适用于表格数据。例如,
import pandas as pd
和df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
。
3. 三维及更高维数据(Tensor)
- 三维张量(Tensor): 对于更高维度的数据,NumPy数组和TensorFlow/PyTorch的张量(tensor)被用来表示。这些结构可以处理多个维度的数据。例如,
tensor = np.random.random((3, 3, 3))
表示一个3x3x3的三维数组。
4. 多维数据(Array / N-Dimensional Data)
高级数据则是使用Key-Value方式进行组织数据,在Python中使用字典进行存储数据。在Python中内置的json模块专门用于处理JSON (JavaScript Object Notation)格式的数据。
- 高维数组: NumPy支持多维数组,通过指定多个维度的大小来构建。
arr = np.zeros((2, 3, 4))
表示一个2x3x4的三维数组。
5. 字典与其他关联数据结构
- 字典(Dictionary): 字典是键值对的集合,适用于需要快速查找、插入数据的场景。例如,
my_dict = {'name': 'John', 'age': 25}
。 - 集合(Set): 集合是一组无重复的元素,适用于去重和快速查找。例如,
my_set = {1, 2, 3, 4}
。
6. 树状结构(Tree)
- 树(Tree): 对于有层级关系的数据,通常用树来组织,如文件系统目录结构等。在Python中,可以通过递归方式或特定的库(如
networkx
)来构建和处理树。
7. 图结构(Graph)
- 图(Graph): 图结构是由节点(vertices)和边(edges)组成的,用于表示复杂的关系网络。Python有专门的库,如
networkx
,用来处理图数据。
8. 时间序列数据(Time Series)
- 时间序列(Time Series): 时间序列是按时间顺序排列的数据,常用Pandas的
Series
来组织。例如,ts = pd.Series([1, 2, 3], index=pd.date_range('2020-01-01', periods=3))
。
实例一,一维数据和二位数据的存储
def my_write():#一维数据,可以使用列表,元组,集合lst=['111','222','333','444']with open('stu.csv','w') as file:file.write(','.join(lst)) #将列表转为字符串def my_read():with open('stu.csv','r') as file:s=file.read()lst=s.split(',')print(lst)#存储读取二维数据
def my_write_table():lst=[['商品','单价','数量'],['水杯','99','20'],['鼠标','109','100']]with open('table.csv','w',encoding='utf-8') as file:for item in lst: #item的数据类型是列表line=','.join(item)file.write(line)file.write('\n')def my_read_table():data=[] #存储读取的数据with open('table.csv','r',encoding='utf-8') as file:lst=file.readlines() #每一行是列表中的一个元素print(type(lst),lst)for item in lst: # item是字符串类型new_lst = item[:len(item) - 1].split(',')data.append(new_lst)print(data)if __name__ == '__main__':my_write()my_read()my_write_table()my_read_table()
四,json模块与高维数据的存储与读取
json
模块提供了一组用于操作JSON(JavaScript Object Notation)数据的函数,主要用于在Python对象和JSON格式之间进行转换。JSON是一种轻量级的数据交换格式,广泛用于Web应用和API通信。Python的json
模块使得这种转换变得非常简单。
1. 导入模块
import json
json模块的常用函数
函数名称 | 用途描述 | 常用参数 |
---|---|---|
json.dumps(obj) | 将Python对象转换为JSON字符串 | indent (格式化缩进),sort_keys (排序字典键),ensure_ascii (是否转义非ASCII字符) |
json.loads(s) | 将JSON字符串解析为Python对象 | 无 |
json.dump(obj,file) | 将Python对象写入文件并转换为JSON格式 | indent (格式化缩进),sort_keys (排序字典键),ensure_ascii (是否转义非ASCII字符) |
json.load(file) | 从文件中读取JSON数据并转换为Python对象 | 无 |
json.JSONDecoder() | 用于自定义JSON解码器 | object_hook (自定义JSON对象解析器) |
json.JSONEncoder() | 用于自定义JSON编码器 | default (自定义对象序列化方法) |
json.JSONDecodeError | JSON解码错误时抛出的异常类型 | 无 |
2. Python对象转JSON字符串:json.dumps()
json.dumps()
(dump string)用于将Python对象转换为JSON格式的字符串。常见的Python对象,如字典、列表、元组等,都可以转换为JSON格式。
示例:
import json# Python对象
data = {"name": "John", "age": 30, "city": "New York"}# 转换为JSON字符串
json_string = json.dumps(data)
print(json_string)
输出:
{"name": "John", "age": 30, "city": "New York"}
其他常用的dumps()
参数:
-
indent
: 格式化输出,使得JSON数据更加可读。指定缩进的空格数。json_string = json.dumps(data, indent=4) print(json_string)
输出:
{"name": "John","age": 30,"city": "New York" }
-
sort_keys
: 对键进行排序。json_string = json.dumps(data, sort_keys=True, indent=4) print(json_string)
输出:
{"age": 30,"city": "New York","name": "John" }
-
ensure_ascii
: 默认情况下,dumps()
会转义非ASCII字符。如果你希望保留这些字符,可以设置为False
。data = {"name": "José"} json_string = json.dumps(data, ensure_ascii=False) print(json_string)
输出:
{"name": "José"}
3. JSON字符串转Python对象:json.loads()
json.loads()
(load string)用于将JSON格式的字符串转换为Python对象,通常是字典、列表、字符串等。
示例:
import jsonjson_string = '{"name": "John", "age": 30, "city": "New York"}'# 转换为Python对象
data = json.loads(json_string)
print(data)
输出:
{'name': 'John', 'age': 30, 'city': 'New York'}
4. Python对象写入JSON文件:json.dump()
json.dump()
用于将Python对象直接写入文件中,并以JSON格式存储。
示例:
import jsondata = {"name": "John", "age": 30, "city": "New York"}# 将Python对象写入文件
with open('data.json', 'w') as f:json.dump(data, f)
5. 从JSON文件读取数据:json.load()
json.load()
用于从文件中读取JSON数据,并将其转换为Python对象。
示例:
import json# 从文件读取JSON数据
with open('data.json', 'r') as f:data = json.load(f)print(data)
6. 处理特殊数据类型
在转换过程中,json
模块只支持基本的数据类型,如dict
、list
、str
、int
、float
、bool
和None
。如果需要处理自定义对象(如类实例),你可能需要指定如何将其转换为JSON格式,或者使用default
参数来自定义序列化方法。
示例:自定义对象序列化
import jsonclass Person:def __init__(self, name, age):self.name = nameself.age = age# 自定义序列化方法
def person_serializer(obj):if isinstance(obj, Person):return {"name": obj.name, "age": obj.age}raise TypeError("Type not serializable")person = Person("Alice", 28)# 使用自定义的序列化方法
json_string = json.dumps(person, default=person_serializer)
print(json_string)
输出:
{"name": "Alice", "age": 28}
7. 处理日期和时间
JSON标准不支持日期类型。如果需要将datetime
对象序列化为JSON格式,可以使用default
参数或者通过自定义格式将其转化为字符串。
示例:序列化datetime
对象
import json
from datetime import datetime# 自定义的序列化方法
def datetime_serializer(obj):if isinstance(obj, datetime):return obj.isoformat() # 将datetime转为ISO格式字符串raise TypeError("Type not serializable")now = datetime.now()json_string = json.dumps(now, default=datetime_serializer)
print(json_string)
输出:
"2025-01-27T14:45:30.123456"
实例一,高维数据的存储
import json
lst=[{'name':'csh','age':19,'score':100},{'name':'mgh','age':18,'score':99},{'name':'cbz','age':17,'score':98},
]
#
s=json.dumps(lst,ensure_ascii=False,indent=4) #ensure_ascii正常显示中文,indent增加数据的缩进
print(type(s)) #编码 list-->str,列表中是字典
print(s)#解码
lst2=json.loads(s)
print(type(lst2))
print(lst2)#编码到文件当中
with open('stu.txt','w') as file:json.dump(lst,file,ensure_ascii=False,indent=4)
#解码到程序
with open('stu.txt','r') as file:lst3=json.load(file) #直接就是列表类型print(type(lst3))print(lst3)
五,OS模块与目录文件操作
在Python中,os
模块是用于与操作系统交互的标准库,它提供了许多函数来执行与操作系统相关的任务,如文件和目录操作、环境变量管理等。在文件和目录操作方面,os
模块非常强大,能帮助你处理文件路径、文件权限、目录创建、删除等任务。
1. 导入模块
import os
2. 常用的文件和目录操作函数
函数名 | 用途 | 示例代码 |
---|---|---|
os.getcwd() | 获取当前工作目录 | python<br>import os<br>current_dir = os.getcwd()<br>print(current_dir) |
os.chdir(path) | 改变当前工作目录 | python<br>import os<br>os.chdir('/path/to/directory')<br>print(os.getcwd()) |
os.listdir(path) | 列出指定目录中的所有文件和子目录 | python<br>import os<br>files = os.listdir('/path/to/directory')<br>print(files) |
os.path.join() | 将多个路径组成一个完整路径 | python<br>import os<br>path = os.path.join('folder', 'subfolder', 'file.txt')<br>print(path) |
os.path.exists(path) | 检查指定路径是否存在 | python<br>import os<br>exists = os.path.exists('/path/to/directory')<br>print(exists) |
os.path.isfile(path) | 检查指定路径是否是一个文件 | python<br>import os<br>is_file = os.path.isfile('/path/to/file.txt')<br>print(is_file) |
os.path.isdir(path) | 检查指定路径是否是一个目录 | python<br>import os<br>is_dir = os.path.isdir('/path/to/directory')<br>print(is_dir) |
os.mkdir(path) | 创建一个目录 | python<br>import os<br>os.mkdir('/path/to/directory') |
os.makedirs(path) | 创建多层目录(递归创建所有父目录) | python<br>import os<br>os.makedirs('/path/to/parent/directory') |
os.rmdir(path) | 删除空目录 | python<br>import os<br>os.rmdir('/path/to/directory') |
os.removedirs(path) | 递归删除目录,如果父目录为空,则一起删除 | python<br>import os<br>os.removedirs('/path/to/empty/parent/directory') |
os.remove(path) | 删除文件 | python<br>import os<br>os.remove('/path/to/file.txt') |
os.rename(src, dst) | 重命名文件或目录 | python<br>import os<br>os.rename('old_name.txt', 'new_name.txt') |
os.path.split(path) | 将路径分割为目录和文件名 | python<br>import os<br>directory, filename = os.path.split('/path/to/file.txt')<br>print(directory, filename) |
os.path.splitext(path) | 分割文件的扩展名 | python<br>import os<br>filename, file_extension = os.path.splitext('file.txt')<br>print(filename, file_extension) |
3. 示例操作:目录和文件管理
3.1 获取当前工作目录
import os# 获取当前工作目录
current_dir = os.getcwd()
print(f"Current directory: {current_dir}")
3.2 改变工作目录
import os# 改变当前工作目录
os.chdir('/path/to/new/directory')# 再次打印当前目录
print(f"New current directory: {os.getcwd()}")
3.3 列出目录中的文件和子目录
import os# 列出指定目录中的所有文件和子目录
directory_content = os.listdir('/path/to/directory')
print("Directory content:", directory_content)
3.4 创建新目录
import os# 创建一个目录
os.mkdir('/path/to/new/directory')
3.5 创建多层目录
import os# 创建多层目录
os.makedirs('/path/to/parent/child/directory')
3.6 删除文件和目录
import os# 删除文件
os.remove('/path/to/file.txt')# 删除空目录
os.rmdir('/path/to/empty/directory')
3.7 重命名文件或目录
import os# 重命名文件
os.rename('old_name.txt', 'new_name.txt')# 重命名目录
os.rename('/path/to/old_directory', '/path/to/new_directory')
3.8 判断文件或目录是否存在
import os# 判断文件是否存在
file_exists = os.path.exists('/path/to/file.txt')
print(f"File exists: {file_exists}")# 判断路径是否是目录
is_directory = os.path.isdir('/path/to/directory')
print(f"Is directory: {is_directory}")# 判断路径是否是文件
is_file = os.path.isfile('/path/to/file.txt')
print(f"Is file: {is_file}")
3.9 获取文件的路径信息
import os# 获取文件名和扩展名
filename, file_extension = os.path.splitext('/path/to/file.txt')
print(f"Filename: {filename}, File extension: {file_extension}")# 分割路径为目录和文件名
directory, filename = os.path.split('/path/to/file.txt')
print(f"Directory: {directory}, Filename: {filename}")
4. os.path
子模块:路径操作
os.path
是os
模块中的一个子模块,专门用于路径操作。常见的路径操作函数包括:
os.path.join()
: 拼接路径os.path.exists()
: 检查路径是否存在os.path.isfile()
: 判断路径是否是文件os.path.isdir()
: 判断路径是否是目录os.path.abspath()
: 获取绝对路径os.path.realpath()
: 获取路径的真实路径(去除符号链接)
示例:
import os# 拼接路径
path = os.path.join('folder', 'subfolder', 'file.txt')
print(path)# 获取绝对路径
abs_path = os.path.abspath('file.txt')
print(abs_path)# 判断路径是否存在
if os.path.exists('file.txt'):print("File exists")
else:print("File does not exist")
5. 环境变量操作:os.environ
os
模块还提供了对操作系统环境变量的操作,使用os.environ
字典可以读取、设置或删除环境变量。
示例:获取和设置环境变量
import os# 获取环境变量
path = os.environ.get('PATH')
print(f"PATH: {path}")# 设置新的环境变量
os.environ['MY_VAR'] = 'SomeValue'
print(f"MY_VAR: {os.environ['MY_VAR']}")# 删除环境变量
del os.environ['MY_VAR']
实例一,OS模块的使用
import os
print('当前工作路径:',os.getcwd())
lst=os.listdir()
print('当前路径下的所有目录及文件:',lst)
print('指定路径下所有的目录及文件:',os.listdir('D:/pycharm'))
#创建目录,如果文件已经存在则程序报错
os.mkdir('好好学习')
os.makedirs('./aa/bb/cc') #递归的创建多级目录
os.rmdir('./好好学习') #删除的目录必须存在,否则报错
os.removedirs('./aa/bb/cc') #递归删除多级目录#改变当前工作路径
os.chdir('D:/pycharm')
print('当前工作路径:',os.getcwd()) #这个时候再写代码就会出现在pycharm
#遍历出来目录数,相当于递归
for dirs,dirslst,filelst in os.walk('D:/pycharm/pythonProject'):print(dirs)print(dirslst)print(filelst)
实例二,OS模块的高级操作
import os
#删除文件
os.remove('./a.txt') #删除的文件不存在则程序报错
#重命名文件
os.rename('./aa.txt','new.txt')#转换时间的格式
import time
def date_format(longtime):s=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(longtime))return s#获取文件信息
info=os.stat('./new.txt')
print(type(info),info)print('最近一次访问时间:',date_format(info.st_atime))
print('在windows操作系统中显示的文件的创建时间:',date_format(info.st_ctime))
print('最后一次修改时间',date_format(info.st_mtime))
print('文件的大小(单位是字节)',info.st_size)#启动路径下的文件
os.startfile('calc.exe')
六,OS.path子模块与文件目录操作
os.path
是 Python 标准库中的一个模块,专门用于处理文件和目录路径。它提供了一组跨平台的函数,可以帮助你执行路径相关的操作,比如路径拼接、路径分离、检查文件是否存在、获取文件属性等。os.path
的函数能自动处理不同操作系统(如 Windows、Linux、Mac OS)上的路径分隔符差异,使得代码在多个平台上能够正常运行。
主要功能和方法
1. 路径拼接 (os.path.join()
)
os.path.join()
用于将多个路径组合成一个完整路径。它会根据不同操作系统自动选择正确的路径分隔符(如 /
或 \
)。
import ospath = os.path.join("folder", "subfolder", "file.txt")
print(path)
# 在 Windows 上输出: folder\subfolder\file.txt
# 在 Linux/Mac 上输出: folder/subfolder/file.txt
2. 路径是否存在 (os.path.exists()
)
os.path.exists()
检查给定路径是否存在(文件或目录)。
import osif os.path.exists("file.txt"):print("文件存在")
else:print("文件不存在")
3. 判断路径类型
os.path.isfile()
:判断路径是否是一个文件。os.path.isdir()
:判断路径是否是一个目录。
import osprint(os.path.isfile("file.txt")) # 如果是文件,返回 True
print(os.path.isdir("folder")) # 如果是目录,返回 True
4. 获取绝对路径 (os.path.abspath()
)
os.path.abspath()
返回给定路径的绝对路径。
import osabs_path = os.path.abspath("file.txt")
print(abs_path)
# 输出:/home/user/file.txt(Linux/Mac)或 C:\Users\User\file.txt(Windows)
5. 获取路径的最后部分 (os.path.basename()
)
os.path.basename()
返回路径中的最后一个部分,即文件名或目录名。
import osprint(os.path.basename("/home/user/file.txt"))
# 输出:file.txt
6. 获取路径的目录部分 (os.path.dirname()
)
os.path.dirname()
返回路径中的目录部分,不包含文件名。
import osprint(os.path.dirname("/home/user/file.txt"))
# 输出:/home/user
7. 路径分割 (os.path.split()
)
os.path.split()
将路径分割成一个目录部分和文件名部分,返回一个元组。
import osdir_name, file_name = os.path.split("/home/user/file.txt")
print(dir_name) # 输出:/home/user
print(file_name) # 输出:file.txt
8. 文件扩展名分离 (os.path.splitext()
)
os.path.splitext()
用于分离文件路径的扩展名,返回一个元组,包含路径和扩展名。
import ospath, ext = os.path.splitext("file.txt")
print(path) # 输出:file
print(ext) # 输出:.txt
9. 路径规范化 (os.path.normpath()
)
os.path.normpath()
会规范化路径,去除多余的分隔符和 .
或 ..
。
import ospath = os.path.normpath("/home/user/../user/file.txt")
print(path)
# 输出:/home/user/file.txt
10. 获取文件大小 (os.path.getsize()
)
os.path.getsize()
返回文件的大小(以字节为单位)。
import osfile_size = os.path.getsize("file.txt")
print(f"文件大小: {file_size} 字节")
os.path模块常用函数:
函数 | 功能描述 | 示例代码 |
---|---|---|
os.path.join() | 拼接路径,自动处理分隔符。 | os.path.join("folder", "file.txt") |
os.path.exists() | 检查路径(文件或目录)是否存在。 | os.path.exists("file.txt") |
os.path.isfile() | 判断路径是否为文件。 | os.path.isfile("file.txt") |
os.path.isdir() | 判断路径是否为目录。 | os.path.isdir("folder") |
os.path.abspath() | 获取路径的绝对路径。 | os.path.abspath("file.txt") |
os.path.basename() | 返回路径的最后部分(文件名或目录名)。 | os.path.basename("/home/user/file.txt") |
os.path.dirname() | 返回路径的目录部分,不包含文件名。 | os.path.dirname("/home/user/file.txt") |
os.path.split() | 分割路径为目录部分和文件部分,返回一个元组。 | os.path.split("/home/user/file.txt") |
os.path.splitext() | 分离路径和扩展名,返回一个元组。 | os.path.splitext("file.txt") |
os.path.normpath() | 规范化路径,去除冗余分隔符和相对路径。 | os.path.normpath("/home/user/../user/file.txt") |
os.path.getsize() | 获取文件大小(以字节为单位)。 | os.path.getsize("file.txt") |
os.path.isabs() | 判断路径是否为绝对路径。 | os.path.isabs("/home/user/file.txt") |
os.path.relpath() | 获取相对于另一路径的相对路径。 | os.path.relpath("/home/user/file.txt", "/home") |
os.path.samefile() | 判断两个路径是否指向同一文件或目录(需要实际文件存在)。 | os.path.samefile("file1.txt", "file2.txt") |
os.path.commonpath() | 返回一组路径的最长公共路径。 | os.path.commonpath(['/home/user1', '/home/user2']) |
os.path.commonprefix() | 返回一组路径的最长公共前缀(字符级)。 | os.path.commonprefix(['/home/user1', '/home/user2']) |
示例一,os.path模块的使用
import os.path
print('获取目录或文件的绝对路径:',os.path.abspath('./logo.png'))
print('判断目录或文件在磁盘上是否存:',os.path.exists('date.py')) #相对路径
print('拼接路径:',os.path.join('D:/pycharm/pythonProject','date.py'))
print('分割文件名和文件后缀名:',os.path.splitext('logo.png')) #元组类型
print('提取文件名:',os.path.basename(r'D:/pycharm/pythonProject/logo.png'))
print('提取文件路径:',os.path.dirname(r'D:/pycharm/pythonProject/logo.png'))
print('判断一个路径是否为有效路径:',os.path.isdir(r'logo.png'))
print('判断一个文件是否为有效文件:',os.path.isfile(r'lo.png'))
实战一:批量创建文件
需求:在指定路径下批量创建3000份文本文件,文件名格式为序号物资类别用户识别码组成
- 序号从0001到3000
- 物资类别包括:水果、烟酒、粮油、肉蛋、蔬菜
- 用户识别码为9位的随机十六进制数码
import random
import os
import os.path
#函数式编程
def create_filename():filename_lst=[]lst=['水果','烟酒','粮油','肉蛋','蔬菜'] #物质类别code=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']for i in range(1,3001):filename=''#拼接文件名if i<10:filename+'000'+str(i)elif i<100:filename+'00'+str(i)else:filename+=str(i)#拼接类别filename+='_'+random.choice(lst)#拼接识别码s=''for item in code: #循环的作用是次数s+=random.choice(code)filename+='_'+sfilename_lst.append(filename)return filename_lst#创建文件的函数
def create_file(filename):with open(filename,'w') as file:passif __name__ == '__main__':#在指定路径的文件夹下创建文件path='./date'if not os.path.exists(path):os.mkdir(path)lst=create_filename() #调用获取文件名# 开始创建文件for item in lst:create_file(os.path.join(path,item)+'.txt')
实战二:批量创建文件夹
需求:在指定路径newdir下批量创建指定个数的目录(文件夹),如果newdir目录不存在,则创建
import os
import os.path
def mkdir(path,num):for item in range(1,num+1):os.mkdir(path+'/'+str(item))if __name__ == '__main__':path='./newdir'if not os.path.exists(path):os.mkdir(path)num=eval(input('请输入要创建的目录个数:'))mkdir(path,num)
实战三:记录用户登录日志并查看
需求:创建XX客服管理系统的登录界面,每次登录时,将用户的登录日志写入文件中,并且可以在程序中查看用户的登录日志
import time
def show_info():print('输入提示数字,执行相应操作:0.退出,1.查看登录日志')def write_loginfo(username):with open('log.txt','a',encoding='utf-8') as file:s=f'用户名{username},登录时间{time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))}'file.write(s)file.write('\n')#读取日志函数
def read_loginfo():with open('log.txt','r',encoding='utf-8') as file:while True:line=file.readline()if line=='':breakelse:print(line)if __name__ == '__main__':#write_loginfo('admin')username=input('请输入用户名:')pwd=input('请输入密码:')if username=='admin' and pwd == 'admin':print('登录成功')#将登录信息写入日志文件write_loginfo(username)#提示用户操作show_info()num=eval(input('请输入要操作的数字'))while True:if num==0:print('退出成功')breakelif num==1:print('查看登录日志')read_loginfo()show_info()else:print('输入的数字错误')show_info()num=eval(input('请输入你要操作的数字'))else:print('用户名或密码错误')
实战四:模拟淘宝客服自动回复
需求:淘宝客服为了快速回答买家问题,设置了自动回复的功能,当有买家咨询时,客服自助系统会首先使用提前规划好的内容进行回复,请用Python程序实现这一功能
def find_answer(question):with open('replay.txt','r',encoding='gbk') as file:while True:line=file.readline() #第一次 订单|如果您有任何订单问题,可以登录淘宝账号,点击“我的订单”,查看订单详情if line=='':break #退出的是while循环#字符串的劈分操作keyword=line.split('|')[0]reply = line.split('|')[1]if keyword in question:return replyreturn Falseif __name__ == '__main__':question=input('说出来:')while True:if question=='bye':breakelse:reply=find_answer(question)if reply==False:question=input('输入有误,请输入订单,物流,支付,账户,退出请输入bye:')else:print(reply)question=input('您可以继续提问')print('再见')