第十篇:深入文件夹:Python中的文件管理和自动化技术

深入文件夹:Python中的文件管理和自动化技术

在这里插入图片描述

1 文件系统基础操作

在今天的技术博客中,我们将深入探讨Python中的文件系统基础操作。文件系统对于任何操作系统都是不可或缺的组成部分,它管理着数据的存储、检索以及维护。Python通过其标准库中的模块提供了一系列与文件系统交互的方法。这些方法不仅能帮助我们进行文件的创建、读取、写入和删除操作,还能辅助我们在更高级别上进行文件管理和自动化。

1.1 使用os模块浏览文件系统

os模块是Python标准库的一部分,它提供了一系列与操作系统交互的功能,包括不仅限于文件系统的管理。要开始浏览文件系统,我们首先需要了解如何使用os.listdir()函数列出目录中的内容。这个函数接受一个路径字符串,并返回该路径下所有条目的名称列表。例如:

import os# 获取当前工作目录的内容列表
current_directory_contents = os.listdir('.')
print(current_directory_contents)

在这段代码中,.代表当前目录。这是一个特殊符号,在大多数操作系统中都被解释为当前工作目录。对于上级目录,则使用..表示。

进一步地,我们可以通过遍历返回的列表,使用os.path.isdir()os.path.isfile()来分辨每个条目是文件还是目录。代码示例如下:

for entry in current_directory_contents:if os.path.isdir(entry):print(f"{entry}/ is a directory")elif os.path.isfile(entry):print(f"{entry} is a file")

该段代码演示了如何区分文件和目录。在实际应用中,我们可能需要对文件或目录执行不同的操作,因此这种区分是非常有用的。

1.2 创建、删除文件和目录的命令

接下来,让我们讨论如何使用os模块创建和删除文件或目录。在Python中,创建一个新目录可以通过os.mkdir()函数实现。这个函数只需一个参数,即要创建的目录的名称。例如,若要创建一个名为new_folder的目录,我们可以执行以下代码:

os.mkdir('new_folder')

需要注意的是,如果指定的目录已存在,那么os.mkdir()会抛出一个FileExistsError异常。在编写脚本时,我们通常会先检查目录是否存在,然后再尝试创建它,以避免异常。

删除文件则使用os.remove()函数,其工作方式与os.mkdir()类似,但是它用于删除文件而不是目录。例如,删除一个名为unwanted_file.txt的文件,我们会这样做:

os.remove('unwanted_file.txt')

在实践中,要非常小心地使用os.remove(),因为一旦执行,被删除的文件就无法恢复了。

1.3 os.path模块的路径操作功能

最后,我们来探索一下os.path模块,它提供了一系列用于路径操作的函数。在文件系统中,路径用于指定文件和目录的位置。os.path模块可以帮助我们构建,拆分,分析这些路径。

例如,我们可以使用os.path.join()函数来跨操作系统地构建路径,因为不同的操作系统可能使用不同的路径分隔符。以下是一个如何安全地构建路径的例子:

path = os.path.join('my_directory', 'my_subdirectory', 'myfile.txt')

这样,无论我们的代码运行在哪个操作系统上,os.path.join()都会使用正确的分隔符。

路径拆分也同样重要。os.path.split()可以将路径的最后一个部分与前面的路径分开,而os.path.splitext()则可以分割文件名和它的扩展名。例如:

head, tail = os.path.split('/home/user/myfile.txt')
print("Head:", head) # '/home/user'
print("Tail:", tail) # 'myfile.txt'filename, file_extension = os.path.splitext('myfile.txt')
print("Filename:", filename) # 'myfile'
print("Extension:", file_extension) # '.txt'

在处理文件路径时,经常需要对路径字符串进行此类操作以提取特定的信息,如文件名或目录名。

在本节中,我们覆盖了Python中进行文件系统基础操作的关键概念和方法。我们了解了如何浏览文件系统,创建和删除文件和目录,以及如何操作路径。这些操作构成了文件管理和自动化的基础,对于高效和有效的脚本编写至关重要。在接下来的章节中,我们将继续深入探讨Python中的文件管理和自动化技术。请继续关注。

在这里插入图片描述

2 面向对象的路径操作:使用pathlib

在Python的文件和目录管理领域,pathlib库引入了面向对象的路径操作方式,它不仅提供了一致的接口,还在跨平台处理中显示出了其优势。在本节中,我们将深入探讨pathlib的强大功能。

2.1 简介和pathlibos.path的比较

在Python 3.4之前,文件路径操作主要依赖于os.path模块,它提供了字符串操作路径的各种功能。然而,os.path的接口主要是函数形式,且不直观。随后,pathlib的出现改变了这一局面,它将路径视为对象,从而可以使用面向对象的方式来处理文件和目录。

让我们通过一个简单的比较来理解它们的不同:

使用os.path拼接路径时,我们通常使用os.path.join函数:

import os# 使用os.path拼接路径
path = os.path.join(os.getcwd(), 'my_directory', 'my_file.txt')

而在pathlib中,路径的拼接就像在处理字符串一样简单:

from pathlib import Path# 使用pathlib拼接路径
path = Path.cwd() / 'my_directory' / 'my_file.txt'

在这里,/运算符被重载,使得路径的拼接更加直观和可读。pathlib为我们提供了统一的方法调用,无论是在Windows还是在Unix系统中,这是其相较于os.path的显著优势之一。

2.2 常用Path类方法:遍历目录、文件读写、路径操作

pathlib模块中最核心的对象是Path。这个类封装了大量的方法和属性,用于方便的路径操作和文件处理。以下是一些常用的Path方法和其应用:

  • Path.glob(pattern):此方法允许遍历匹配特定模式的文件,类似于Unix的shell模式匹配。比如,你想获取某个目录下所有的.txt文件:

    p = Path('.')
    for txt_file in p.glob('*.txt'):print(txt_file)  # 输出所有.txt文件的路径
    
  • Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None):这是一个方便的方法,用于打开路径表示的文件,类似于内置的open函数。它省去了将Path对象转换为字符串的步骤:

    p = Path('my_file.txt')
    with p.open('r', encoding='utf-8') as f:content = f.read()print(content)
    
  • Path.read_text(encoding=None, errors=None)Path.write_text(data, encoding=None, errors=None, newline=None):这两个方法进一步简化了文件读写步骤,使其可以直接在Path对象上完成:

    p = Path('my_file.txt')
    content = p.read_text(encoding='utf-8')  # 读取文本内容
    p.write_text('新内容', encoding='utf-8')  # 写入文本内容
    
  • Path.mkdir(mode=0o777, parents=False, exist_ok=False):这个方法用于创建新目录,parents参数指定是否创建父目录,exist_ok指定如果目录存在时是否引发异常。

    p = Path('my_new_directory')
    p.mkdir(parents=True, exist_ok=True)  # 安全创建目录
    
  • Path.resolve():此方法可以将路径解析为其绝对路径,非常有用,尤其是在路径可能包含符号链接或相对规范时。

    p = Path('some_relative_path')
    absolute_path = p.resolve()  # 获取绝对路径
    print(absolute_path)
    

2.3 实例代码:使用pathlib进行文件的创建、读取和写入

现在,让我们通过一个具体的例子来展示pathlib如何在实际应用中简化文件操作。假设我们要创建一个日志文件,如果它不存在,然后写入一些内容:

from pathlib import Path# 设置日志文件路径
log_file_path = Path('logs') / 'system.log'# 确保日志文件所在的目录存在
log_file_path.parent.mkdir(parents=True, exist_ok=True)# 检查日志文件是否存在,如果不存在,则创建
if not log_file_path.is_file():log_file_path.touch()# 写入日志内容
log_content = "System started successfully."
log_file_path.write_text(log_content + '\n', encoding='utf-8', errors='replace')# 读取并打印日志内容
print(log_file_path.read_text(encoding='utf-8'))

在这段代码中,我们首先设置了日志文件的路径。然后,我们确保日志文件的目录存在,如果不存在,则使用mkdir()方法创建它。接下来,我们检查日志文件是否存在,不存在则使用touch()方法创建它。最后,我们使用write_text()方法写入日志内容,并通过read_text()方法读取内容。

在整个过程中,你可以看到,pathlib提供了一种更为直观和连贯的方式来处理文件和目录。通过使用pathlib,我们可以以一种更为自然和面向对象的方式来处理路径,这使得代码更加易读和易维护。

总结来说,pathlib是Python中处理文件和目录的现代化工具。它提供的面向对象的接口,以及清晰简洁的语法,使得路径操作更加直观和灵活。无论你是在写简单的脚本还是在构建复杂的系统,pathlib都是一个非常有用的工具。在接下来的部分中,我们将继续探索文件系统的监控与远程操作,这将为我们的自动化任务提供更强大的能力。

在这里插入图片描述

3 文件读写操作详解

在深入探讨Python中如何优雅且有效地与文件进行交互之前,让我们了解一些基础但关键的概念。文件操作无疑是编程中常见的需求,Python提供了多种方式来读取、写入和操作文件数据。在这一节中,我们将详细介绍打开、读取和写入文件的不同模式,并通过实例代码来加深理解。

3.1 打开和关闭文件的各种模式

文件的打开模式决定了你可以对文件执行哪些操作。在Python中,open() 函数是实现文件读写的关键。它的基本语法如下:

file_object = open(file_name, mode)

其中,file_name 是文件的名称,mode 指定了文件打开的模式。下面是一些常见的模式:

  • 'r':以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
  • 'w':以写入方式打开文件,会覆盖原有文件。如果文件不存在,则创建新文件。
  • 'x':如果文件已存在,使用此模式打开将引发异常。
  • 'a':以追加模式打开文件。如果文件存在,文件指针将会放在文件的结尾。
  • 'b':以二进制模式打开文件。
  • 't':以文本模式打开(默认)。可以在其他模式后追加 't' 来使用。
  • '+':以读写模式打开文件(可以追加到其他模式中使用)。

例如,如果你需要读取一个二进制文件,你应该使用 'rb' 模式:

file_object = open('example.bin', 'rb')

在使用完文件后,你应该调用 close() 方法来关闭文件并释放系统资源:

file_object.close()

3.2 读取文件内容的方法及其实例代码

Python提供了多种方法来读取文件内容。以下是几种常用的方法:

  1. read(size):它会读取一定数量的数据,然后作为字符串(在文本模式下)或字节串(在二进制模式下)返回。

    with open('example.txt', 'r') as file:content = file.read(10) # 读取前10个字符
    
  2. readline(size):它从文件中读取一行。

    with open('example.txt', 'r') as file:line = file.readline()while line != '':print(line, end='')line = file.readline()
    
  3. readlines():它读取文件中的所有行并作为一个字符串列表返回。

    with open('example.txt', 'r') as file:lines = file.readlines()for line in lines:print(line, end='')
    

在处理大文件时,推荐使用迭代器来逐行读取,因为这种方式不会一次性将整个文件加载到内存中。

3.3 写入文件的方法及注意事项

写入文件也有多种方式,最常用的如下:

  1. write(string):将字符串写入文件。

    with open('example.txt', 'w') as file:file.write('Hello, World!')
    
  2. writelines(list):将一个字符串列表写入文件。

    with open('example.txt', 'w') as file:lines = ['First line', 'Second line']file.writelines(lines)
    

在使用写入模式时,要注意以下几点:

  • 使用 'w' 模式时,如果文件已存在,之前的内容将会被覆盖。
  • 写入操作不会自动添加行与行之间的分隔符,如需要可以在每行的末尾加上 \n
  • 使用 'a' 模式可以在不覆盖现有内容的情况下追加新内容。

现在,让我们通过一个例子来具体说明如何使用这些读写操作。假设我们有一个任务是读取一个文本文件的内容,对其进行处理,然后将结果写入一个新文件。我们首先使用 'r' 模式打开源文件,读取内容。然后,我们对内容进行处理,在这个例子中,我们将文本转换为大写。最后,我们打开一个新文件,并使用 'w' 模式将处理后的内容写入:

# Step 1: Read the content from the source file
with open('source.txt', 'r') as source_file:content = source_file.read()# Step 2: Process the content
processed_content = content.upper()# Step 3: Write the processed content to a new file
with open('destination.txt', 'w') as destination_file:destination_file.write(processed_content)

在本节中,我们已经介绍了如何在Python中打开、读取和写入文件。文件操作是编程中的基础技能,掌握它可以帮助我们在各种应用程序中处理数据。在后续的节中,我们将探讨如何监控文件系统的变化,并利用Python脚本自动化文件管理任务。

在这里插入图片描述

4 文件系统监控:使用watchdog

文件系统监控在自动化任务中扮演着重要角色。watchdog库提供了一种简单而强大的方式来监视文件系统的变化,并在检测到事件时执行相应的操作。在本节中,我们将深入探讨watchdog库的基本介绍、如何设置监控目录以及处理文件系统事件的方法。

4.1 watchdog库的介绍和基本用法

watchdog库是一个Python库,用于监控文件系统的变化,例如文件或目录的创建、修改、删除等事件。它是一个跨平台的库,可以在Windows、Linux和macOS等操作系统上运行。

首先,确保你已经安装了watchdog库。你可以使用pip进行安装:

pip install watchdog

一旦安装完成,我们就可以开始使用watchdog了。下面是一个简单的示例代码,演示了如何监视指定目录中文件的创建事件:

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandlerclass MyHandler(FileSystemEventHandler):def on_created(self, event):if event.is_directory:print(f"Directory created: {event.src_path}")else:print(f"File created: {event.src_path}")if __name__ == "__main__":path = "/path/to/directory"  # 修改为你要监视的目录路径event_handler = MyHandler()observer = Observer()observer.schedule(event_handler, path, recursive=True)observer.start()try:while True:time.sleep(1)except KeyboardInterrupt:observer.stop()observer.join()

在这个示例中,我们首先定义了一个继承自FileSystemEventHandler的类MyHandler,并重写了on_created方法,以处理文件创建事件。然后,我们创建了一个观察者对象observer,并调用schedule方法来设置监控路径和事件处理器。最后,通过调用start方法启动观察者,然后进入一个无限循环中,直到按下Ctrl+C停止程序。

4.2 设置监控目录和处理文件系统事件

在使用watchdog监控文件系统时,需要考虑以下几点:

  • 监控的路径:可以监控单个文件、单个目录,甚至是整个文件系统。通过调用schedule方法来设置监控路径。
  • 事件处理watchdog提供了一系列事件处理器,如on_createdon_modifiedon_deleted等,用于处理不同类型的文件系统事件。

除了文件创建事件之外,watchdog还可以监视文件修改、删除等事件。你可以根据需要重写相应的事件处理方法,以执行你想要的操作。

4.3 实践示例:自动化响应目录变化

为了更好地理解watchdog的实际应用,让我们来看一个示例场景:自动备份文件。假设我们希望在某个目录中的文件被修改时自动备份到另一个目录。我们可以利用watchdog来监控原始目录,并在文件被修改时执行备份操作。

import shutil
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandlerclass BackupHandler(FileSystemEventHandler):def __init__(self, src_dir, dest_dir):self.src_dir = src_dirself.dest_dir = dest_dirdef on_modified(self, event):if not event.is_directory:src_file = event.src_pathdest_file = f"{self.dest_dir}/{event.src_path.split('/')[-1]}"shutil.copy2(src_file, dest_file)print(f"File {src_file} has been modified. Backup created at {dest_file}")if __name__ == "__main__":src_dir = "/path/to/source/directory"  # 原始目录路径dest_dir = "/path/to/backup/directory"  # 备份目录路径event_handler = BackupHandler(src_dir, dest_dir)observer = Observer()observer.schedule(event_handler, src_dir)observer.start()try:while True:time.sleep(1)except KeyboardInterrupt:observer.stop()observer.join()

在这个示例中,我们定义了一个BackupHandler类,继承自FileSystemEventHandler,并重写了on_modified方法,在文件被修改时执行备份操作。然后,我们创建了一个观察者对象observer,并调用schedule方法设置监控路径和事件处理器。最后,启动观察者并进入循环等待用户中断。

这只是watchdog库的一个简单应用示例,你可以根据实际需求扩展和修改代码,以满足各种文件系统监控任务的要求。

通过本节的学习,你已经了解了如何使用watchdog库监控文件系统的变化,并在检测到事件时执行相应的操作。继续深入学习和实践,你将能够更好地利用Python进行文件管理和自动化任务的开发。

在这里插入图片描述

5 远程文件操作:使用paramikoPyFilesystem2

当我们处理本地文件和目录时,Python提供了许多内置库和函数来帮助我们。但是,当涉及到远程文件系统时,情况会变得更加复杂。在这一节中,我们将深入研究如何使用paramikoPyFilesystem2库来管理远程文件系统。

5.1 paramiko库的基本使用:SSH连接和执行命令

paramiko是一个Python实现的SSHv2协议,提供了客户端和服务器的功能。它广泛应用于远程服务器的自动化管理任务。首先,我们需要安装paramiko

pip install paramiko

接着,创建SSH客户端实例并连接到远程服务器,过程如下:

import paramikossh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('remote_host_ip', username='user', password='password')

这里,set_missing_host_key_policy用于处理本地没有远程机器SSH密钥的情况,AutoAddPolicy会自动添加主机名和新主机密钥到本地的HostKeys对象中。

一旦连接建立,你可以执行命令:

stdin, stdout, stderr = ssh.exec_command('ls -l')
print(stdout.read().decode('utf-8'))

exec_command方法执行远程命令,返回三个流对象:stdin, stdout, stderr,分别对应命令的标准输入、输出和错误。

5.2 使用PyFilesystem2进行远程文件系统操作

PyFilesystem2是一个抽象文件系统的库,它允许你编写代码来操作文件系统,而不用担心底层的细节。这意味着你可以使用同样的代码来操作本地文件系统、远程文件系统甚至是内存中的文件系统。首先安装fsfs.sshfs

pip install fs fs.sshfs

一个简单的例子,使用fs.open_fs

from fs import open_fswith open_fs('sftp://user:password@remote_host_ip/') as sftp_fs:for path in sftp_fs.walk.files(filter=['*.py']):print(path)

这段代码创建了一个SFTP文件系统对象,并列出了所有的.py文件。

5.3 结合paramikofs.sshfs进行文件传输和管理

在某些情况下,我们需要结合使用paramiko进行复杂的SSH会话管理和PyFilesystem2进行文件操作。比如,我们需要使用paramiko来设置一个SFTP会话,并使用PyFilesystem2的高级接口来操作文件。

import fs.sshfs
import paramikossh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.connect('remote_host_ip', username='user', password='password')sftp = ssh.open_sftp()
with fs.sshfs.SSHFS(sftp) as sftp_fs:sftp_fs.upload('local_file.txt', 'remote_file.txt')

在这个例子中,我们首先创建了一个paramiko的SSH客户端用于连接远程服务器,然后通过该连接打开了一个SFTP会话,并通过SSHFS类将本地文件上传到远程服务器。

这种组合使用的方法允许我们利用paramiko的强大功能来进行精细的SSH会话控制,同时享受PyFilesystem2简洁的文件系统操作API。

在上面的过程中,有一个重要的数学模型是RSA公钥加密,它是SSH安全性的基础。一个简单的公钥加密模型是:

c ≡ m e m o d n c \equiv m^e \mod n cmemodn

其中, c c c 是加密后的数据, m m m 是原始数据, e e e n n n 是公钥的一部分。解密过程使用私钥 d d d

m ≡ c d m o d n m \equiv c^d \mod n mcdmodn

paramiko中,客户端和服务器之间的所有通信都是通过这种加密模式保护的。

通过深入理解和应用这些技术,我们可以在Python中有效地管理本地和远程文件系统,自动化处理许多复杂的任务。这些方法不仅可以节省我们的时间,而且可以减少人为错误,提高我们的工作效率。

在这里插入图片描述

6 目录遍历与文件搜索

在本节中,我们将深入探索如何在Python中遍历目录树以及如何使用文件搜索来定位特定的文件。这些技术对于编写文件管理脚本和自动化任务至关重要。

6.1 os.walk函数的使用示例

遍历目录树可以使用os.walk函数来实现。os.walk是一个生成器,它为我们提供了在目录树中游走的能力。当你在一个目录树中调用os.walk时,它会返回一个三元组(dirpath, dirnames, filenames)

  • dirpath是一个字符串,表示当前正在遍历的路径。
  • dirnames是一个列表,包含dirpath下所有子目录的名字。
  • filenames同样是一个列表,包含dirpath下所有非目录文件的名字。

使用os.walk的基本格式如下所示:

import osfor dirpath, dirnames, filenames in os.walk('/path/to/directory'):# 操作代码

这里,'/path/to/directory'是需要遍历的目录路径。

一个具体的例子:

import osfor dirpath, dirnames, filenames in os.walk('/path/to/directory'):print(f"Found directory: {dirpath}")for file_name in filenames:print(file_name)

上述代码会打印出每个遍历的目录及其包含的文件名。

6.2 glob模块的模式匹配功能

如果你需要更复杂的文件搜索模式,glob模块可以帮助你。glob提供了一个函数glob.glob,它支持Unix shell风格的通配符。

基础用法如下:

import glob# 列出所有的.py文件
for file_name in glob.glob('*.py'):print(file_name)

此外,glob还支持递归搜索,通过在模式中使用**匹配任意多个目录:

for file_name in glob.glob('**/*.py', recursive=True):print(file_name)

这会打印出所有子目录中扩展名为.py的文件。

6.3 实现自定义文件搜索器

尽管os.walkglob都很强大,但有时候我们需要更精确的控制或者更复杂的搜索条件。此时,我们可以创建自定义的文件搜索器。

假设我们需要找到所有在过去24小时内修改过且文件大小超过1MB的.log文件。我们可以这样实现:

import os
import time# 定义24小时前的时间戳
twenty_four_hours_ago = time.time() - 24*60*60# 定义一个函数来检查文件是否符合要求
def is_file_match(file_path):# 检查文件大小是否超过1MBif os.path.getsize(file_path) < 1 * 1024 * 1024:return False# 检查文件最后修改时间if os.path.getmtime(file_path) < twenty_four_hours_ago:return Falsereturn True# 对每个文件执行搜索
for dirpath, dirnames, filenames in os.walk('/path/to/logs'):for filename in filenames:if filename.endswith('.log'):file_path = os.path.join(dirpath, filename)if is_file_match(file_path):print(f"Found log file: {file_path}")

在这个例子中,我们首先定义了一个函数is_file_match来判断一个文件是否符合我们的条件。然后我们用os.walk遍历日志文件目录,并对每个.log文件执行我们的判断逻辑。

通过这种方式,我们可以灵活地定义搜索条件,不仅可以根据文件的名称和大小,还可以根据修改时间、权限、所有者等属性进行搜索。

在编写文件搜索器时,我们可能会遇到需要使用复杂的数学逻辑来决定文件是否与搜索条件匹配。例如,我们可能会使用布尔逻辑来合并多个条件:

match = ( s i z e > 1 M B ) ∧ ( m o d i f i e d _ t i m e > 24 hours ago ) ∧ ( extension = . l o g ) \text{match} = (size > 1MB) \land (modified\_time > \text{24 hours ago}) \land (\text{extension} = .log) match=(size>1MB)(modified_time>24 hours ago)(extension=.log)

这里, ∧ \land 表示逻辑与操作, s i z e size size m o d i f i e d _ t i m e modified\_time modified_time e x t e n s i o n extension extension 是我们的文件属性。

总体而言,遍历目录和搜索文件是Python文件管理中的重要组成部分,不仅为我们提供了自动化处理文件的能力,也为文件数据分析和管理提供了极大的便利。借助os.walkglob等工具,我们可以轻松实现复杂的文件搜索和处理任务,使我们的文件管理脚本更强大、灵活和高效。

在这里插入图片描述

7 文件元数据和权限管理

7.1 访问文件的元数据信息

文件的元数据是关于文件的数据,例如文件的大小、创建时间、修改时间等。在Python中,可以通过os模块和pathlib模块来访问这些信息。os模块提供了os.stat()函数,它返回一个os.stat_result对象,其中包含了大量的文件属性。例如:

import osfile_stats = os.stat('example.txt')
print("File Size:", file_stats.st_size)  # 文件大小
print("Last Modified:", file_stats.st_mtime)  # 最后修改时间
print("Last Accessed:", file_stats.st_atime)  # 最后访问时间
print("Creation Time:", file_stats.st_ctime)  # 创建时间(在Unix系统中是最近状态变更时间)

在Windows系统中,创建时间可以通过st_ctime获取,而在Unix系统中,这通常表示最后状态更改的时间。这些信息对于管理文件、监控文件状态变更或编写自动化脚本进行文件操作都非常有用。

7.2 文件权限的查看和修改

文件权限是决定哪些用户可以访问文件以及他们可以进行哪些操作(如读取、写入、执行等)的规则。在Python中,你可以使用os模块来查看和修改文件权限。例如,使用os.chmod可以改变文件的权限。在Linux系统中,文件权限包括读(r)、写(w)和执行(x),每种权限对应一个特定的数值(读=4,写=2,执行=1)。

import os# 查看文件权限
file_path = 'example.txt'
file_stats = os.stat(file_path)
print("File Permissions:", oct(file_stats.st_mode)[-3:])# 修改文件权限(例如,只有所有者可以读写,其他人没有任何权限)
os.chmod(file_path, 0o600)# 再次查看修改后的文件权限
file_stats = os.stat(file_path)
print("Updated File Permissions:", oct(file_stats.st_mode)[-3:])

这里,oct(file_stats.st_mode)[-3:]将文件模式转换为八进制数,后三位代表三组不同用户的权限:文件所有者、同一用户组的用户和其他用户。

7.3 实例代码:检查和更改文件权限

下面的实例演示如何编写一个Python脚本来检查某个目录下所有文件的权限,并将那些公开可写的文件权限修改为只读。

import osdef secure_folder(folder_path):for foldername, subfolders, filenames in os.walk(folder_path):for filename in filenames:full_path = os.path.join(foldername, filename)stats = os.stat(full_path)permissions = oct(stats.st_mode)[-3:]  # 获取文件权限if permissions[1] == '7' or permissions[1] == '6' or permissions[1] == '2':print(f"Changing permissions for {full_path}")os.chmod(full_path, 0o644)  # 修改权限为所有者读写,组读,其他读secure_folder('/path/to/your/folder')

该脚本递归遍历指定目录,检查每个文件的权限。如果发现文件拥有过于宽松的权限(如组用户或其他用户有写权限),它会将这些文件的权限更改为更加严格的模式。通过这种方式,可以增强文件的安全,防止未经授权的修改。

文件元数据和权限管理是文件系统管理中的重要组成部分,合理使用Python提供的功能,可以有效地保护文件安全,避免数据泄露风险。

在这里插入图片描述

8 文件和目录的高级操作

在深入探索Python文件管理和自动化之旅中,我们已经覆盖了从基础操作如文件读写到文件系统监控等多种技术。现在,我们进入一个更为高级的领域:文件和目录的高级操作。这些操作不仅增强了我们对文件系统的控制力,还极大地提升了我们处理大量文件的效率。

8.1 文件名的批量更改

在现实世界的脚本自动化中,我们经常遇到批量修改文件名的需求。这可能是因为我们需要将文件名标准化,或是因为我们在迁移文件时需要遵循新的命名规则。不管是何种原因,ospathlib模块提供了强大的工具来完成这项工作。

举个例子,假设我们有一个包含多个图片文件的目录,这些图片文件的名字包含不同日期格式,我们需要统一这些日期格式。考虑到Python字符串处理的能力,我们可以使用正则表达式来识别和修改这些日期。

首先,我们使用os.listdirpathlib.Path.glob列出所有文件,然后使用re模块来搜索和替换文件名中的日期。以下是一个简单的例子:

import os
import redef standardize_date(file_name):# 使用正则表达式匹配日期并转换格式为YYYY-MM-DDmatch = re.search(r'(\d{2})-(\d{2})-(\d{4})', file_name)if match:return re.sub(r'(\d{2})-(\d{2})-(\d{4})', r'\3-\1-\2', file_name)return file_namedef rename_files(directory):for file_name in os.listdir(directory):new_name = standardize_date(file_name)if new_name != file_name:os.rename(os.path.join(directory, file_name),os.path.join(directory, new_name))rename_files('/path/to/your/directory')

在这个代码片段中,我们定义了一个函数standardize_date,它使用正则表达式来查找和转换日期格式。然后,在rename_files函数中,我们遍历目录中的每个文件,并仅当新名字和旧名字不同时重命名文件。

8.2 文件夹内容的同步和备份

文件夹的内容同步和备份是文件管理中的另一核心任务。这通常涉及确保两个目录包含一致的文件集,或是为了防止数据丢失而创建文件副本。在Python中,shutil库提供了直接的方法来同步两个文件夹的内容。

假设我们需要将一个文件夹中的内容备份到另一个位置,我们可以使用shutil.copytree来递归复制整个目录树。如果要同步两个目录,可能需要更细致的逻辑来确定哪些文件被修改过,哪些文件是新的,哪些文件已经不再存在了。

一个简化的同步逻辑可以通过以下步骤操作:

  1. 列出源目录和目标目录中的所有文件。
  2. 对于源目录中的每个文件,如果它在目标目录中不存在,或者文件内容不同,那么复制该文件。
  3. 如果目标目录中存在而源目录中不存在的文件,则将其删除。

这是一个非常初级的同步机制,实际应用可能会更复杂。例如,我们可能需要比较文件的修改时间戳来决定是否复制,或者可能需要创建文件的增量备份而非完整备份。

8.3 使用shutil模块高效地复制和移动文件

shutil模块是Python提供的一个非常强大的工具,用于执行文件和目录的高级操作。除了上面提到的复制整个目录树,它还提供了一系列用于复制、移动、改名和删除Python文件的高级接口。

例如,shutil.copy函数可以用来复制单个文件,shutil.copy2则在复制文件时还会尝试保持元数据。对于移动文件,我们可以使用shutil.move,它可以处理跨文件系统的文件移动操作。

以下是使用shutil.copy2复制文件并保留元数据的例子:

import shutilsource_file = '/path/to/source/file.txt'
destination_dir = '/path/to/destination/directory'shutil.copy2(source_file, destination_dir)

在这个例子中,copy2函数被用来复制文件,同时尽可能保留了如文件的最后访问时间和修改时间等元数据。

在编写文件管理脚本时,处理各种异常情况也是至关重要的。例如,在复制文件之前,我们可能需要检查文件是否存在,或者在尝试删除目录之前,我们需要确保该目录不是当前工作目录。

Python的文件管理和自动化技术提供了庞大的可能性空间,无论是简单的批量重命名还是复杂的同步和备份操作。通过结合ospathlibshutil等模块,我们可以构建强大而灵活的脚本,使得文件管理自动化不仅可能,而且变得简单和高效。

在任何自动化任务中,充分理解和规划你的需求是成功的关键。确保你的代码做了足够的错误处理,日志记录,并且在实施之前进行了彻底的测试。随着技能的提升和实践的积累,文件管理和自动化将成为你工具箱中的一项强大的技能。

在这里插入图片描述

9 可视化文件系统信息

在现代编程实践中,可视化是理解和呈现数据的重要手段。对于文件系统管理,可视化技术可以帮助我们更直观地了解磁盘使用情况和文件分布情况,从而进行更有效的数据管理和优化。在这一节中,我们将探讨如何使用Python中的图表库,如matplotlib和plotly,来可视化文件系统的相关信息。

9.1 使用图表表示磁盘使用情况

磁盘使用情况的可视化是系统管理中的一个常见需求。这可以帮助系统管理员迅速了解当前磁盘的使用状况,比如哪些文件夹占用了大量空间。我们可以使用matplotlib库来创建条形图或饼图,显示各个主要目录的占用比例。

首先,我们需要收集磁盘各部分的使用数据。在Python中,我们可以使用os模块来获取文件和目录的大小。以下是一个示例代码,它遍历指定目录,并计算每个子目录的磁盘使用量:

import os
import matplotlib.pyplot as pltdef get_size(start_path = '.'):total_size = 0for dirpath, dirnames, filenames in os.walk(start_path):for f in filenames:fp = os.path.join(dirpath, f)# skip if it is symbolic linkif not os.path.islink(fp):total_size += os.path.getsize(fp)return total_sizedef plot_disk_usage(start_path):sizes = []labels = []for entry in os.listdir(start_path):full_path = os.path.join(start_path, entry)if os.path.isdir(full_path):size = get_size(full_path)sizes.append(size)labels.append(entry)# Plottingplt.figure(figsize=(10, 8))plt.pie(sizes, labels=labels, autopct='%1.1f%%')plt.title('Disk Usage by Directory')plt.show()plot_disk_usage('/path/to/directory')

此脚本首先定义了一个get_size函数,用于计算一个目录下所有文件的总大小。然后定义了一个plot_disk_usage函数,它生成了一个饼图,显示了指定路径下每个文件夹的磁盘使用情况。

9.2 文件种类和大小的可视化展示

除了总的磁盘使用情况,了解不同类型文件的分布也很有用。例如,我们可能想要知道图片、文档、视频文件分别占用了多少存储空间。这可以通过扩展名来分类文件,然后使用plotly库来生成交互式图表。

import os
from collections import defaultdict
import plotly.graph_objects as godef files_distribution_by_type(start_path):ext_size = defaultdict(int)for root, dirs, files in os.walk(start_path):for file in files:ext = file.split('.')[-1]file_path = os.path.join(root, file)if not os.path.islink(file_path):ext_size[ext] += os.path.getsize(file_path)labels = list(ext_size.keys())values = list(ext_size.values())# Plottingfig = go.Figure(data=[go.Pie(labels=labels, values=values)])fig.update_traces(textposition='inside', textinfo='percent+label')fig.show()files_distribution_by_type('/path/to/directory')

这段代码首先使用os.walk函数遍历指定目录,并根据文件扩展名分类统计文件大小。使用plotly的饼图组件go.Pie创建了一个交互式的文件类型分布图。

9.3 第三方库如matplotlib、plotly的应用实例

通过上述两个示例,我们可以看到matplotlibplotly在文件系统可视化中的应用。这两个库各有千秋:matplotlib适合生成静态的、高质量的图像,适用于打印或报告中;而plotly提供了丰富的交互功能,适合在Web环境中使用,让用户可以通过交互来进一步探索数据。

综合来看,可视化是理解复杂文件系统状态的强大工具。通过适当的图表和图形,可以更直观地展示信息,帮助进行更有效的数据分析和决策。

在这里插入图片描述

10 脚本实战:自动化文件管理任务

在本节中,我们将深入Python的文件管理领域,探索如何通过脚本自动化一些常规的文件管理任务。我们将通过实用的实战示例,演示如何运用Python的强大功能来简化文件管理并提高工作效率。

10.1 自动清理临时文件

在日常计算机使用中,临时文件的累积会占用大量的磁盘空间,这些文件通常是用完即弃的,但有时候我们忘记了去手动清理它们。Python可以帮助我们自动化这一繁琐的清理过程。

一个基本的临时文件清理脚本可能看起来像下面这样:

import os
import shutil
from pathlib import Path
from datetime import datetime, timedelta# 定义临时文件夹路径
temp_dir = Path('/path/to/temp')# 获取当前时间
now = datetime.now()# 设定过期时间为7天
expire_time = timedelta(days=7)# 遍历临时文件夹
for item in temp_dir.iterdir():# 检查文件最后修改时间if now - datetime.fromtimestamp(item.stat().st_mtime) > expire_time:if item.is_file():item.unlink()  # 删除文件elif item.is_dir():shutil.rmtree(item)  # 删除文件夹

10.2 定期备份重要文件

对于重要文件,定期备份是一个好习惯。Python可以通过定时执行脚本来帮助我们自动备份。

一个简单的备份脚本可能如下:

import shutil
from datetime import datetime# 定义重要文件的路径和备份路径
important_files = ['/path/to/important/file1', '/path/to/important/file2']
backup_dir = '/path/to/backup/'# 获取当前时间,并将其作为备份的一部分
time_stamp = datetime.now().strftime('%Y%m%d%H%M%S')# 对每个重要文件进行备份
for file_path in important_files:# 为备份文件创建唯一的名称backup_path = f"{backup_dir}{Path(file_path).stem}_{time_stamp}{Path(file_path).suffix}"# 执行文件复制shutil.copy(file_path, backup_path)

10.3 监控文件夹变化并执行任务

监控文件夹并在检测到变化时执行特定任务是自动化文件管理中的一个进阶环节。watchdog库可以帮助我们检测文件系统的变化。

以下是一个使用watchdog来监控目录变化的简单示例:

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandlerclass MyHandler(FileSystemEventHandler):def on_modified(self, event):print(f'Event type: {event.event_type}  Path: {event.src_path}')# 在这里添加你想执行的任务# ...# 设置监控目录
watch_dir = "/path/to/watch"# 创建事件处理器
event_handler = MyHandler()# 设置Observer
observer = Observer()
observer.schedule(event_handler, watch_dir, recursive=True)# 开始监控
observer.start()
try:while True:# 这里是为了保持脚本运行time.sleep(1)
except KeyboardInterrupt:observer.stop()observer.join()

通过上面的代码,我们可以监控指定目录的变化,并在每次修改时执行我们定义的on_modified函数。这对于实时备份或实时同步文件非常有用。

在实际应用中,我们可能会碰到复杂的情况,如需处理异常、日志记录或者优化性能等等。正确地处理这些高级话题需要对Python及其相关库有深入的理解。

自动化文件管理不仅仅是关于写脚本,更是关于理解需求、规划任务并实现可靠的自动化流程。开发这样的脚本时,我们需要考虑到各种边界条件和异常情况,确保脚本在各种环境下都能可靠运行。此外,还需考虑到性能和资源使用,确保脚本不会消耗过多计算资源。

通过本节的学习,我们了解了Python在文件管理和自动化任务方面的能力。希望这些示例能够激发你的灵感,并帮助你在实际工作中应用Python去解决复杂问题。记得,实践是检验真理的唯一标准。所以,开始编写你的脚本,测试它们,并不断改进,直到它们可以完美地满足你的需求。

在这里插入图片描述

11 错误处理与调试

在文件操作过程中,经常会遇到各种错误和异常情况。为了保证程序的稳定性和可靠性,我们需要对这些错误进行处理和调试。本节将介绍如何处理文件读写中的常见异常、如何记录文件操作过程的日志以及一些调试技巧的分享。

11.1 处理文件读写中的常见异常

在文件读写过程中,可能会遇到以下常见的异常:

  • FileNotFoundError:文件不存在错误。
  • PermissionError:权限不足错误。
  • IOError:文件读写错误。
  • IsADirectoryError:试图对目录进行读写操作错误。

为了处理这些异常,可以使用try-except语句来捕获异常并进行相应的处理。

try:file = open('example.txt', 'r')# 执行文件读取操作file.close()
except FileNotFoundError:print("文件不存在")
except PermissionError:print("权限不足")
except IOError:print("文件读写错误")
except IsADirectoryError:print("试图对目录进行读写操作")

通过使用try-except语句,可以捕获特定的异常,并在捕获到异常后执行相应的处理操作,比如打印错误信息或者进行其他的补救措施。

11.2 日志记录文件操作过程

日志记录是一种非常有用的调试手段,可以记录程序运行过程中的关键信息和错误,方便后续的分析和排查问题。在Python中,可以使用内置的logging模块来进行日志记录。

import logginglogging.basicConfig(filename='file_operations.log', level=logging.DEBUG)try:file = open('example.txt', 'r')# 执行文件读取操作file.close()
except Exception as e:logging.exception('发生异常:')

在上述示例中,我们首先通过调用basicConfig方法来设置日志记录的文件名和日志级别。然后,通过调用logging.exception方法来记录异常信息,包括异常类型和异常信息。这样在程序运行时,如果发生异常,就会将异常信息记录到指定的日志文件中。

11.3 调试技巧分享

调试是解决问题的关键步骤,以下是一些常用的调试技巧:

  • 使用print语句输出关键变量的值,以便观察程序的执行过程。
  • 使用断点调试工具(如pdb)进行单步调试,可以逐行执行代码并观察变量的值。
  • 使用日志记录技术,记录程序运行过程中的关键信息和错误。
  • 使用try-except语句捕获异常,并在捕获到异常后打印错误信息。
  • 使用调试工具(如IDE自带的调试器)进行调试,可以更方便地观察变量的值和程序的执行流程。

通过合理使用这些调试技巧,可以帮助我们快速定位和解决文件操作过程中的问题,提高开发效率。

本节介绍了如何处理文件读写中的常见异常、如何记录文件操作过程的日志以及一些调试技巧的分享。在文件管理和自动化技术的实践中,灵活运用这些技巧将会帮助我们更好地开发和调试程序,提高工作效率。

在这里插入图片描述

12 进一步阅读材料

对于那些希望深入理解Python在文件管理和自动化技术方面应用的读者,拓展阅读材料是不可或缺的。在这一节中,我们将介绍一些官方文档的章节以及其他一些高级文件操作相关的库和工具,这些材料可以帮助你更深层次地理解和应用Python在这一领域的强大功能。

12.1 推荐阅读官方文档章节

为了更全面地掌握文件系统操作的知识,以下是一些必读的Python官方文档章节:

  • os模块:详细介绍了Python标准库中的os模块,包括其提供的用于与操作系统进行交互的函数。官方文档链接:https://docs.python.org/3/library/os.html

  • pathlib模块:这一部分解释了如何以面向对象的方式使用文件系统路径。官方文档链接:https://docs.python.org/3/library/pathlib.html

  • shutil模块:提供了一系列用于文件操作的高级接口,如复制、移动、删除文件或目录。官方文档链接:https://docs.python.org/3/library/shutil.html

  • logging模块:在处理文件操作时记录日志是一种很好的调试和错误跟踪方法,logging模块的官方文档提供了详尽的使用指南。官方文档链接:https://docs.python.org/3/library/logging.html

这些文档不仅提供了函数和类的详细用法,还通常包含了使用示例,这些示例可以帮助你理解如何在实际编程中应用这些模块。

12.2 其他高级文件操作相关的库和工具介绍

除了Python标准库中的模块,还有一些第三方库提供了更为丰富和高级的文件操作功能:

  • Watchdog:一个用于监控文件系统事件的库。它可以帮助你编写自动化脚本,以响应文件的创建、修改、删除等事件。项目链接:https://github.com/gorakhargosh/watchdog

  • Paramiko:一个用于进行SSH通信的Python实现,非常适合需要远程文件操作的情况。项目链接:http://www.paramiko.org/

  • PyFilesystem2:一个提供了跨多种文件系统统一操作界面的库。例如,你可以使用相同的代码来操作本地文件、WebDAV或SFTP服务器上的文件。项目链接:https://github.com/PyFilesystem/pyfilesystem2

  • Scandir:在Python 3.5中被集成到了os模块,但在早期版本中,它是一个高效遍历目录的第三方库。项目链接:https://github.com/benhoyt/scandir

  • matplotlibplotly:这两个库可以用来可视化文件和目录的统计数据。例如,你可以用它们来绘制磁盘使用情况的饼图或条形图。

深入研究这些库和工具,你将能够编写出更加强大、灵活的文件操作和自动化脚本。

阅读和实践这些建议的材料,将极大地提升你在Python文件管理和自动化技术方面的知识和技能。无论你是希望编写简单的脚本来自动化日常任务,还是需要开发复杂的系统来处理文件和目录管理,这些资源都将是你宝贵的参考资料。

在这里插入图片描述

13 结语

总结文件和目录管理的最佳实践

在我们的探索旅程中,我们已经涉足了Python在文件和目录管理上的深层次操作,包括基本的文件系统操作,面向对象的路径操作,文件的读写,文件系统监控,远程文件操作,目录遍历与文件搜索,文件元数据和权限管理,以及文件和目录的高级操作。每一个方面,我们都尽力提供了充分的概念解释和具体的代码实例,以确保你不仅理解这些工具是如何工作的,而且能够将它们运用于实际的场景。

文件和目录管理的最佳实践不仅仅是关于正确使用API或者编写无误的代码,它更多的是关于如何以高效、可靠和安全的方式来组织和处理文件系统。以下是一些我们总结出来的最佳实践:

  1. 使用面向对象的pathlib: 尽管老式的osos.path模块能够胜任许多任务,但是pathlib提供了更加直观和便捷的方法来处理文件路径。它使得代码更加易读,也更易于维护。

  2. 自动化常规任务: 学习并利用脚本来自动化如清理临时文件、定期备份以及监控文件夹变化等重复性工作。这不仅节省时间,同时减少了因手动处理而产生错误的可能性。

  3. 充分利用文件元数据: 了解如何获取和使用文件的元数据,如修改时间和权限,可以帮助你编写出更加智能和适应性强的文件处理逻辑。

  4. 错误处理: 总是预期并适当地处理可能发生的异常,例如使用tryexcept块。这不仅可以防止程序在遇到错误时崩溃,还可以提供更多关于问题的信息,使你能够更快地解决它们。

  5. 保持安全性: 在处理文件时,始终牢记安全性,特别是当涉及到执行外部命令或处理来自不可信源的文件时。确保对输入进行清理和验证,以防止注入攻击。

  6. 进行日志记录: 通过日志记录文件操作过程,你可以追踪历史行为,这对于调试、监控以及审计都是非常有价值的。

鼓励读者通过项目实战深化学习

当然,理论知识是不够的,真正的能力来自于实践。我强烈鼓励你将这些知识应用到自己的项目中去。通过实战,你将更深刻地理解文件和目录管理的各个方面,遇到的问题和挑战也会促使你去寻找更好的解决方案,这个过程将极大地增强你的问题解决能力。

你可以从简单的自动化脚本开始,比如编写一个简单的程序来组织你的下载文件夹,或者自动备份重要文档。然后,你可以逐步尝试更复杂的项目,比如开发一个可以监控网络文件系统变化并做出响应的系统。随着你能力的提升,你也可以为开源项目贡献代码,或者发布自己的Python包。

实战项目不仅会帮助你巩固所学知识,还可能激发你创造新工具、新方法来解决现有问题的灵感。每一行代码,每一个函数,每一个模块,都是通往精通的阶梯。

在本篇文章的最后,我想提醒大家,技术总是在不断变化的,Python和文件管理也不例外。继续学习,关注新工具和新库的出现,以及它们如何能够帮助你更好地完成工作。我希望Python系列文章能为你的Python学习之旅提供坚实的基础,同时也能激发你对深入学习的渴望。祝你在编程世界里旅途愉快,不断探索,永远进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1411928.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

专项技能训练五《云计算网络技术与应用》实训7-1:安装mininet

文章目录 mininet安装1. 按6-1教程安装opendaylight控制器。2. 按6-2教程安装RYU控制器。3. 按5-1教程安装openvswitch虚拟交换机并开启服务。4. 将老师所给mininet安装包试用winSCP传送至电脑端。5. 安装net-tools。6. 安装mininet7. 安装完成后&#xff0c;使用命令建立拓扑&…

Python量化炒股的数据信息获取

Python量化炒股的数据信息获取 在炒股实战中&#xff0c;为了提高选股的质量&#xff0c;往往需要获取更多关注个股的数据信息&#xff0c;如个股的员工情况&#xff0c;管理人员任职情况&#xff0c;大股东信息&#xff0c;股份质押和冻结信息以及分红送股信息等。 获取上市…

EKS创建ebs存储卷

1、创建ebs卷 也可以aws命令创建 # aws ec2 create-volume --availability-zone ap-east-1a --size 100 --volume-type gp3 {"AvailabilityZone": "ap-east-1a","Encrypted": false,"VolumeType": "gp3","VolumeId&q…

关于YOLO8学习(二)数据集收集,处理

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 简介 本文将会讲解: (1)如何通过三方网站,获取可用于训练的数据源 (2)通过三方网址,选择合适的手机,通过手动标注,转换为可用于训练的数据源 开发环境 win10、python 3.11、cmake、pytorch2.0.1+cu117…

01-MySQL 基础篇笔记

一、MySQL 概述 1.1 数据库相关概念 数据库&#xff1a;&#xff08;DB&#xff1a;DataBase&#xff09; 存储数据的仓库&#xff0c;数据是有组织的进行存储 数据库管理系统&#xff1a;&#xff08;DBMS&#xff1a;DataBase Management System&#xff09; 操作和管理数…

【Gateway远程开发】0.5GB of free space is necessary to run the IDE.

【Gateway远程开发】0.5GB of free space is necessary to run the IDE. 报错 0.5GB of free space is necessary to run the IDE. Make sure that there’s enough space in following paths: /root/.cache/JetBrains /root/.config/JetBrains 原因 下面两个路径的空间不…

EPAI手绘建模APP动画编辑器、信息、工程图

④ 动画&#xff1a;打开关闭动画编辑器。APP中动画包含两个部分&#xff0c;动画编辑器和动画控制器。动画编辑器用来编辑动画。具体来说&#xff0c;选中一个模型后&#xff0c;给模型添加移动、旋转、缩放三种关键帧&#xff0c;不同的模型添加不同的关键帧&#xff0c;实现…

计算机网络——Dijkstra路由算法

实验目的 实现基于 Dijkstra 算法的路由软件 实验内容 网络拓扑如图所示 实验过程 先编写开辟应该图的空间&#xff0c;然后给点映射数字&#xff0c;构建图。程序获取用户输入的学号&#xff0c;构建图中边的权值。接下来程序从用户输入获取最短路径的搜索起点&#xff0…

基于FPGA的数字信号处理(8)--RTL运算的溢出与保护

前言 在做加、减、乘、除等运算时&#xff0c;经常会发生 溢出 的情况。比如1个4bits的计数器&#xff08;每个时钟累加1&#xff09;&#xff0c;在4’b1111 1 后&#xff0c;原本其期望值应该是 151 即16&#xff0c;但是4bits的寄存器能表示的最大值只是4‘b1111即15&…

docker私有仓库的registry

简介 Docker私有仓库的Registry是一个服务&#xff0c;主要用于存储、管理和分发Docker镜像。具体来说&#xff0c;Registry的功能包括&#xff1a; 存储镜像&#xff1a;Registry提供一个集中的地方来存储Docker镜像&#xff0c;包括镜像的层次结构和元数据。 版本控制&…

深入学习和理解Django视图层:处理请求与响应

title: 深入学习和理解Django视图层&#xff1a;处理请求与响应 date: 2024/5/4 17:47:55 updated: 2024/5/4 17:47:55 categories: 后端开发 tags: Django请求处理响应生成模板渲染表单处理中间件异常处理 第一章&#xff1a;Django框架概述 1.1 什么是Django&#xff1f;…

翔云优配恒生指数涨1.85%、恒生科技指数涨3.74% 小鹏汽车涨超8%

5月3日港股开盘&#xff0c;恒生指数涨1.85%&#xff0c;报18543.3点&#xff0c;恒生科技指数涨3.74%&#xff0c;报4009.96点&#xff0c;国企指数涨2.23%&#xff0c;报6580.81点&#xff0c; 翔云优配是一家领先的在线投资平台,提供全球范围内的股票、期货、基金等交易服务…

高级数据结构与算法习题(9)

一、判断题 1、Let S be the set of activities in Activity Selection Problem. Then the earliest finish activity am​ must be included in all the maximum-size subset of mutually compatible activities of S. T F 解析:F。设S是活动选择问题中的一…

【简单介绍下链表基础知识】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

飞书API(7):MySQL 入库通用版本

一、引入 在上一篇介绍了如何使用 pandas 处理飞书接口返回的数据&#xff0c;并将处理好的数据入库。最终的代码拓展性太差&#xff0c;本篇来探讨下如何使得上一篇的最终代码拓展性更好&#xff01;为什么上一篇的代码拓展性太差呢&#xff1f;我总结了几点&#xff1a; 列…

数据库开发关键之与DQL查询语句有关的两个案例

案例 案例1 条件分页查询 查看项目经理提供给我们的需求文档 模糊匹配的含义是 只要包含"张"就可以 use dduo;-- 按照需求完成员工管理的条件分页查询 根据输入条件 查询第一页的数据 每页展示10条记录 -- 输入条件&#xff1a; -- 姓名&#xff1a; 张 -- 年龄&…

关于MS-DOS时代的回忆

目录 一、MS-DOS是什么&#xff1f; 二、MS-DOS的主要功能有哪些&#xff1f; 三、MS-DOS的怎么运行的&#xff1f; 四、微软开源MS-DOS源代码 五、高手与漂亮女同学 一、MS-DOS是什么&#xff1f; MS-DOS&#xff08;Microsoft Disk Operating System&#xff09;是微软公…

MongoDB的分片集群

MongoDB分片技术 介绍 ​ 分片&#xff08;sharding&#xff09;是MongoDB用来将大型集合分割到不同服务器上采用的方法。分片这种说法起源于关系型数据库。但是实际上非关系型数据库在分片方面相比于传统的关系型数据库更有优势。 ​ 与MySQL分库方案对比&#xff0c;MongoDB…

SpringCloud微服务:负载均衡

负载均衡原理 获取 serviceId&#xff0c;也就是服务名称根据 serviceId 拉取服务列表利用负载均衡算法选择一个服务重构请求的 URL 路径&#xff0c;发起远程调用 切换负债均衡算法 自定义 ReactorServiceInstanceLoadBalancer 指定负载均衡器配置

力扣每日一题106:从中序与后序遍历序列构造二叉树

题目 中等 相关标签 相关企业 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder …