我们可以用 os.listdir in Python 获取时间戳信息吗(比如 ls -l)?

Can we get the timestamp information with os.listdir in Python (like ls -l)?

我联系 SFTP 服务器并根据修改后的时间戳显示文件。

目前,它是使用类似的东西完成的:

  1. files = os.listdir(SFTP)
  2. 循环 files 并使用 os.stat 获取时间戳。
  3. 对 Python 中的最终列表进行排序。

当 SFTP 位于不同的服务器上时,第 2 步中的循环成本非常高,因为它必须为每个文件从服务器到 SFTP 进行网络调用。

有没有办法使用 os.listdir 或类似的 API 获取文件和修改时间?

我正在使用 Windows 后端,SFTP 连接通常是使用 win32wnet.WNetAddConnection2 包完成的。一个通用的解决方案会有所帮助,如果不是一个特定的解决方案也应该没问题。

您应该为此使用特殊的库,例如 sftp or ftplib,它们提供了对您有帮助的特定实用程序。 另外,你可以尝试在服务器上调用有趣的命令。

如果你能向服务器发送一行命令,你可以[os.stat(i) for i in os.listdir()]

如果这对你不起作用,我想你可以这样做 os.system("ls -l")

如果这些都不起作用,请告诉我!

如果您使用的是 Windows,那么使用 os.scandir()(python 3.5+)或向后移植 scandir 模块会收获很多: scandir.scandir()

那是因为在 Windows(与 Linux/Unix 相反),os.listdir() 已经在幕后执行了文件统计,但结果除了名称外都被丢弃了。这迫使您执行另一个 stat 调用。

scandir returns 目录条目列表,而不是名称。在 windows 上,size/object 类型字段已经填满,因此当您对条目执行 stat 时(如下例所示),成本为零:

(取自https://www.python.org/dev/peps/pep-0471/

def get_tree_size(path):
    """Return total size of files in given path and subdirs."""
    total = 0
    for entry in os.scandir(path):
        if entry.is_dir(follow_symlinks=False):
            total += get_tree_size(entry.path)
        else:
            total += entry.stat(follow_symlinks=False).st_size
    return total

所以只需将您的第一个 os.listdir() 呼叫替换为 os.scandir(),您将获得所有信息,费用与简单的 os.listdir()

相同

(这是 Windows 上最有趣的,而 Linux 上的则少得多。我在 Windows 上的慢速文件系统上使用它并获得了 8 倍的性能提升与旧 os.listdir 相比,在我的例子中是 os.path.isdir