您一定在项目中多次使用过Python中os模块提供的函数。这些可用于创建文件、遍历目录、获取当前目录的信息、执行路径操作等等。
在本文中,我们将讨论与 os 模块中的任何函数一样有用但很少使用的函数。
当处理共享公共目录结构的多个文件时,您可能希望找到最长的共享路径。 os.path.commonpath() 就是这样做的。这在组织文件或处理跨环境的不同路径时非常有用。
这是一个例子:
import os paths = ['/user/data/project1/file1.txt', '/user/data/project2/file2.txt'] common_path = os.path.commonpath(paths) print("Common Path:", common_path)
此代码将为我们提供这两个路径共享的公共路径。
Common Path: /user/data
您可以看到 os.path.commonpath() 获取路径名列表,手动写下它们可能不切实际。
在这种情况下,最好迭代所有目录、子目录和文件名,然后查找公共路径。
import os def get_file_paths(directory, file_extension=None): # Collect all file paths in the directory (and subdirectories, if any) file_paths = [] for root, dirs, files in os.walk(directory): for file in files: if file_extension is None or file.endswith(file_extension): file_paths.append(os.path.join(root, file)) return file_paths # Specify the root directory to start from directory_path = 'D:/SACHIN/Pycharm/Flask-Tutorial' # If you want to filter by file extension file_paths = get_file_paths(directory_path, file_extension='.html') # Find the common path among all files if file_paths: common_path = os.path.commonpath(file_paths) print("Common Path:", common_path) else: print("No files found in the specified directory.")
在此示例中,函数 get_file_paths() 从上到下遍历目录并附加在 file_paths 列表中找到的所有路径。如果我们想查找特定文件,此函数可以选择使用文件扩展名。
现在我们可以轻松找到任意目录的公共路径了。
Common Path: D:\SACHIN\Pycharm\Flask-Tutorial\templates
如果您使用 os.listdir() 来获取目录的内容,请考虑使用 os.scandir() 代替。它不仅速度更快,而且还返回 DirEntry 对象,该对象提供有用的信息,例如文件类型、权限以及条目是文件还是目录。
这是一个例子:
import os with os.scandir('D:/SACHIN/Pycharm/osfunctions') as entries: for entry in entries: print(f"{entry.name} : \n" f">>>> Is File: {entry.is_file()} \n" f">>>> Is Directory: {entry.is_dir()}")
在此示例中,我们使用 os.scandir() 并传递一个目录,然后迭代该目录并打印信息。
.idea : >>>> Is File: False >>>> Is Directory: True main.py : >>>> Is File: True >>>> Is Directory: False sample.py : >>>> Is File: True >>>> Is Directory: False
假设您正在处理文件并需要检查其扩展名,您可以从 os.path.splitext() 函数获得帮助。它将文件路径分为根目录和扩展名,可以帮助您确定文件类型。
import os filename = 'report.csv' root, ext = os.path.splitext(filename) print(f"Root: {root} \n" f"Extension: {ext}")
输出
Root: report Extension: .csv
看看一些路径可能很奇怪的情况,当时 os.path.splitext() 是如何工作的。
import os filename = ['.report', 'report', 'report.case.txt', 'report.csv.zip'] for idx, paths in enumerate(filename): root, ext = os.path.splitext(paths) print(f"{idx} - {paths}\n" f"Root: {root} | Extension: {ext}")
输出
0 - .report Root: .report | Extension: 1 - report Root: report | Extension: 2 - report.case.txt Root: report.case | Extension: .txt 3 - report.csv.zip Root: report.csv | Extension: .zip
已经有一个常用的功能可以让我们创建目录。但是当您创建嵌套目录时呢?
使用 os.mkdir() 创建嵌套目录可能会很麻烦,因为它一次只能创建一个目录。 os.makedirs() 允许您一次性创建多个嵌套目录,并且 exit_ok=True 参数确保如果目录已经存在,它不会抛出错误。
import os paths = ['/user/data/project1/file1.txt', '/user/data/project2/file2.txt'] common_path = os.path.commonpath(paths) print("Common Path:", common_path)
当我们运行这个程序时,它会创建指定的目录和子目录。
Common Path: /user/data
如果我们再次运行上面的程序,由于exist_ok=True,它不会抛出错误。
与 os.rename() 类似,os.replace() 将文件移动到新位置,但它会安全地覆盖目标位置的任何现有文件。这对于您更新或备份文件并希望确保旧文件被安全替换的任务很有帮助。
import os def get_file_paths(directory, file_extension=None): # Collect all file paths in the directory (and subdirectories, if any) file_paths = [] for root, dirs, files in os.walk(directory): for file in files: if file_extension is None or file.endswith(file_extension): file_paths.append(os.path.join(root, file)) return file_paths # Specify the root directory to start from directory_path = 'D:/SACHIN/Pycharm/Flask-Tutorial' # If you want to filter by file extension file_paths = get_file_paths(directory_path, file_extension='.html') # Find the common path among all files if file_paths: common_path = os.path.commonpath(file_paths) print("Common Path:", common_path) else: print("No files found in the specified directory.")
在这段代码中,main.py 文件将被重命名为 new_main.py,就像 os.rename() 函数一样,但这个操作就像全取或全取。这意味着文件替换发生在一个不可分割的步骤中,因此整个操作要么成功,要么根本没有任何变化。
Common Path: D:\SACHIN\Pycharm\Flask-Tutorial\templates
出于加密目的,您需要一个安全的随机数据源。 os.urandom() 生成适合生成随机 ID、令牌或密码等操作的随机字节。对于敏感数据来说,它比随机模块更安全。
os.urandom() 使用您正在使用的操作系统从各种资源生成的随机性,使字节(数据)不可预测。
在 Windows 中,它使用 BCryptGenRandom() 生成随机字节。
import os with os.scandir('D:/SACHIN/Pycharm/osfunctions') as entries: for entry in entries: print(f"{entry.name} : \n" f">>>> Is File: {entry.is_file()} \n" f">>>> Is Directory: {entry.is_dir()}")
输出
.idea : >>>> Is File: False >>>> Is Directory: True main.py : >>>> Is File: True >>>> Is Directory: False sample.py : >>>> Is File: True >>>> Is Directory: False
Python 中的 os.path.samefile() 函数用于检查两个路径是否引用文件系统上的 同一文件 或 目录。在多个路径可能指向同一物理文件的情况下,例如处理符号链接、硬链接或同一位置的不同绝对和相对路径时,它特别有用。
import os filename = 'report.csv' root, ext = os.path.splitext(filename) print(f"Root: {root} \n" f"Extension: {ext}")
os.path.samefile() 被设计为仅当两个路径都引用磁盘上的相同文件(例如硬链接或符号链接到文件系统上相同数据的文件)时才返回 True。
os.path.relpath() 是一个计算函数,用于计算两个路径之间的相对路径。这在动态构建文件路径或使用相对导入时特别有用。
考虑以下示例:
Root: report Extension: .csv
在此示例中,我们的 target_path 包含我们必须导航的路径,start_path 包含我们必须开始计算到 target_path 的相对路径的路径。
当我们运行它时,我们得到以下输出。
import os paths = ['/user/data/project1/file1.txt', '/user/data/project2/file2.txt'] common_path = os.path.commonpath(paths) print("Common Path:", common_path)
这意味着我们必须向上三个目录,然后向下到engine/log.py。
当我们执行文件写入(file.write())操作时,数据不会立即保存到磁盘,而是保存到系统的缓冲区中,如果在将数据写入磁盘之前发生意外情况,数据丢失。
os.fsync() 强制写入数据,确保数据完整性。它在记录日志或写入不能丢失的关键数据时特别有用。
Common Path: /user/data
调用 os.fsync(f.fileno()) 以确保数据立即写入磁盘而不是留在缓冲区中。
os.fsync() 需要文件描述符,这就是我们传递 f.fileno() 的原因,f.fileno() 是系统分配给我们正在操作的文件的唯一整数。
如果您正在创建 CLI 工具,格式化输出以适合终端宽度可以使输出更清晰。 os.get_terminal_size() 为您提供当前终端的宽度和高度,使动态格式化内容变得容易。
import os def get_file_paths(directory, file_extension=None): # Collect all file paths in the directory (and subdirectories, if any) file_paths = [] for root, dirs, files in os.walk(directory): for file in files: if file_extension is None or file.endswith(file_extension): file_paths.append(os.path.join(root, file)) return file_paths # Specify the root directory to start from directory_path = 'D:/SACHIN/Pycharm/Flask-Tutorial' # If you want to filter by file extension file_paths = get_file_paths(directory_path, file_extension='.html') # Find the common path among all files if file_paths: common_path = os.path.commonpath(file_paths) print("Common Path:", common_path) else: print("No files found in the specified directory.")
当我们在终端中运行此代码时,我们会获取运行此脚本的终端的大小。
Common Path: D:\SACHIN\Pycharm\Flask-Tutorial\templates
注意:在无法访问终端的 IDE 上直接运行脚本时,可能会出现错误。
?如果您喜欢这篇文章,您可能还会感兴趣
✅在 FastAPI 前端流式传输视频。
✅如何修复 Python 中的循环导入。
✅Flask 中的模板继承。
✅如何在 Python 中使用类型提示?
✅如何从 pandas 的数据集中查找并删除不匹配的列?
✅学习率如何影响 ML 和 DL 模型?
现在就这些。
继续编码✌✌。
以上是Python 中有用但很少使用的操作系统函数的详细内容。更多信息请关注PHP中文网其他相关文章!