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

时间:2018-02-12 14:02:39

标签: python windows python-os

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

目前,使用以下内容完成:

  1. files = os.listdir(SFTP)
  2. 循环files并使用os.stat获取时间戳。
  3. 用Python排序最终列表。
  4. 当SFTP位于不同的服务器上时,步骤2中的这种循环非常昂贵,因为它必须为每个文件从服务器向SFTP进行网络呼叫。

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

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

3 个答案:

答案 0 :(得分:2)

您应该使用特殊库,例如documentationsftp,它们提供对您有帮助的特定工具。 此外,您可以尝试在服务器上调用有趣的命令。

答案 1 :(得分:2)

如果您能够向服务器发送一行命令,则可以执行 <li *ngFor="let item of serviceList; let i = index;"> <button *ngIf="currentTools contains i" (click)="processService(item)"> Run Service</button> </li>

如果这不适合你,我想你可以做[os.stat(i) for i in os.listdir()]

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

答案 2 :(得分:2)

如果您使用的是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.listdir相比,性能提升了8倍,然后是{{1在我的情况下)