簡體   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