我们可以用 os.listdir in Python 获取时间戳信息吗(比如 ls -l)?
Can we get the timestamp information with os.listdir in Python (like ls -l)?
我联系 SFTP
服务器并根据修改后的时间戳显示文件。
目前,它是使用类似的东西完成的:
files = os.listdir(SFTP)
- 循环
files
并使用 os.stat
获取时间戳。
- 对 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
)
我联系 SFTP
服务器并根据修改后的时间戳显示文件。
目前,它是使用类似的东西完成的:
files = os.listdir(SFTP)
- 循环
files
并使用os.stat
获取时间戳。 - 对 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
)