欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > python学习之文件及IO操作

python学习之文件及IO操作

2025/2/22 2:04:38 来源:https://blog.csdn.net/zhongyuekang820/article/details/145673843  浏览:    关键词:python学习之文件及IO操作

一,文件的基本概念

文件的基本概念涉及存储、读取和操作数据的方式。简而言之,文件是计算机中用于保存信息的容器,按一定的格式存储数据,可以是文本、二进制或其他格式。下面是一些关于文件的核心概念:

1. 文件类型

  • 文本文件:以字符的形式存储数据,通常用 .txt.csv.log 等扩展名。可以直接用文本编辑器查看和编辑。
  • 二进制文件:以二进制的形式存储数据,通常用 .jpg.mp3.exe 等扩展名。需要特定的程序才能正确读取和操作。

2. 文件的结构

  • 文件头(Header):文件的开头部分,通常包含文件格式的元数据,如版本信息、文件大小等。
  • 文件内容:实际存储的数据部分,文本文件是由字符组成,二进制文件是由字节组成。

3. 文件的打开与关闭

  • 打开文件:在进行读取或写入之前,必须首先打开文件。打开文件时指定文件路径以及访问模式(例如:只读、写入、追加等)。
  • 关闭文件:完成操作后,需要关闭文件,以释放系统资源。在编程语言中,通常通过调用特定的关闭函数来完成此操作。

4. 文件访问模式

文件访问模式是打开文件时指定的选项,决定了我们如何访问文件。常见的模式包括:

  • 只读模式 (r):只能读取文件内容,不能修改。如果文件不存在,会报错。
  • 写入模式 (w):创建一个新文件或清空已有文件并写入数据。如果文件已存在,会覆盖原文件。
  • 追加模式 (a):打开文件进行写入,但不会覆盖原文件内容,而是在文件末尾追加内容。
  • 二进制模式 (b):用于处理二进制文件,例如 rbwb

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
  • 模式(例如:rwa 等)

常见的文件打开模式:

打开模式说明
'r'只读模式(read):文件必须存在,打开后只能读取,不能修改。
'w'写入模式(write):如果文件存在,会覆盖原有内容;如果文件不存在,会创建新文件。
'a'追加模式(append):如果文件存在,会在文件末尾添加内容;如果文件不存在,会创建新文件。
'b'二进制模式(binary):以二进制格式打开文件,通常与其他模式一起使用(如 rbwb)。
'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 = 5name = "John"
  • 列表(List): 一维的有序集合,可以包含多个元素,支持索引和切片操作。比如,my_list = [1, 2, 3, 4, 5]
  • 数组(Array): NumPy库提供的数组通常比Python列表在处理大规模数据时更高效,支持向量化操作。比如,import numpy as nparr = 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 pddf = 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.JSONDecodeErrorJSON解码错误时抛出的异常类型

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模块只支持基本的数据类型,如dictliststrintfloatboolNone。如果需要处理自定义对象(如类实例),你可能需要指定如何将其转换为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.pathos模块中的一个子模块,专门用于路径操作。常见的路径操作函数包括:

  • 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份文本文件,文件名格式为序号物资类别用户识别码组成

  1. 序号从0001到3000
  2. 物资类别包括:水果、烟酒、粮油、肉蛋、蔬菜
  3. 用户识别码为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('再见')

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词