2

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

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

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

当 SFTP 在不同的服务器上时,第 2 步中的这种循环非常昂贵,因为它必须为每个文件从服务器向 SFTP 进行网络调用。

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

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

4

3 回答 3

2

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

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

scandir返回目录条目列表,而不是名称。在 windows 上,大小/对象类型字段已经被填充,因此当您stat对条目执行 a 时(如下例所示),它的成本为零:

(取自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 倍的性能提升)os.path.isdir

于 2018-02-12T14:33:24.850 回答
2

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

于 2018-02-12T14:09:09.930 回答
2

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

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

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

于 2018-02-12T14:23:09.793 回答