繁体   English   中英

我们可以在Python中使用os.listdir获得时间戳信息(例如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后端,通常使用win32wnet.WNetAddConnection2程序包完成SFTP连接。 通用解决方案将很有帮助,即使不是特定解决方案也可以。

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

如果您能够将一行命令发送到服务器,则可以[os.stat(i) for i in os.listdir()]

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

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

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

这是因为在Windows(相对于Linux / Unix)上, os.listdir()已经在后台执行了文件状态统计,但结果被丢弃,除了名称之外。 这会迫使您执行另一个stat调用。

scandir返回目录条目列表,而不是名称。 在Windows上,大小/对象类型字段已经填充,因此在条目上执行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上的慢速文件系统上使用它,与旧版os.listdiros.path.isdir相比,性能提高了8倍。 )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM