Python:在 Try/Except 循环中减去文件名中的分钟关闭时间变量
Python: Subtract Minute off Time Variable in Filename within Try/Except Loop
我正在尝试使用 Python 来 post 每晚通过 API 放入共享文件夹的文件。所有 posting 代码都有效——我唯一不能完全理解的是 Python 自动抓取文件名并将其上传到 SFTP。
该文件的命名约定是:fileYYMMDDHHMM.txt
(均为两位数)因此,如果它是昨晚在 10:10pm 生成的,它将是 file1606272210.txt
。如果我可以 Python 自动获取该文件名,那么我就可以自动提交它。这是我已经发现的非常接近的结果(并且不会产生错误):
import datetime
import os.path, time
file = '/Users/Ryan/'
def modification_date(folderfile):
t = os.path.getmtime(folderfile)
return datetime.datetime.fromtimestamp(t)
mdate = modification_date(file)
md = mdate.strftime("%y%m%d%H%M")
return 理论上可以通过附加文件夹上次修改的时间来工作,因为该代码 return 类似于 file1606272214.txt
。虽然问题是我们的数据库会根据它创建文件的时间自动附加分钟时间,而不是当它到达我的文件夹时。所以我通常会休息大约五分钟,但它永远不会 100% 一致。
我最初的想法是尝试编写一个循环,在我的 modification_date 脚本中减去一分钟,直到它真正找到文件——但我认为我在 try/except
尚未实现的东西。而且我也不确定这是否是最好的解决方案 - 对任何事情都持开放态度。
谁能帮我解决这个问题?
因此,既然您的评论已经表明它是一致的并且始终是最新的,那么您可以使用一些巧妙的小技巧。
首先,os
模块有一个名为 os.listdir(path)
的命令 - 这将为您提供给定目录(上面的“/Users/Ryan”)中文件的文件名。由于开头是一致的并且数字是降序排列的,因此您可以使用内置函数 sorted()
对名称列表进行排序。这将对它们进行排序,使最新的(最高序号,因为数字是可预测的)将排在最后。您可以 list.pop()
关闭最后一个或直接访问它 (list[-1]
) 并用它做您想做的事(移动它等等)。
如果您在同一目录中有额外的 and/or 静态文件,您可能需要过滤以您的事物开头的事物 - 列表理解可以做到这一点;
files_to_check = [name for name in sorted(os.listdir("/Users/...")) if name.startswith("file")]
它会按顺序为您提供每个文件名,只要名称以 "file"
开头即可。你可以让它强制正确的一切,但是你会进入正则表达式,这在这种情况下可能是过大的。
我正在尝试使用 Python 来 post 每晚通过 API 放入共享文件夹的文件。所有 posting 代码都有效——我唯一不能完全理解的是 Python 自动抓取文件名并将其上传到 SFTP。
该文件的命名约定是:fileYYMMDDHHMM.txt
(均为两位数)因此,如果它是昨晚在 10:10pm 生成的,它将是 file1606272210.txt
。如果我可以 Python 自动获取该文件名,那么我就可以自动提交它。这是我已经发现的非常接近的结果(并且不会产生错误):
import datetime
import os.path, time
file = '/Users/Ryan/'
def modification_date(folderfile):
t = os.path.getmtime(folderfile)
return datetime.datetime.fromtimestamp(t)
mdate = modification_date(file)
md = mdate.strftime("%y%m%d%H%M")
return 理论上可以通过附加文件夹上次修改的时间来工作,因为该代码 return 类似于 file1606272214.txt
。虽然问题是我们的数据库会根据它创建文件的时间自动附加分钟时间,而不是当它到达我的文件夹时。所以我通常会休息大约五分钟,但它永远不会 100% 一致。
我最初的想法是尝试编写一个循环,在我的 modification_date 脚本中减去一分钟,直到它真正找到文件——但我认为我在 try/except
尚未实现的东西。而且我也不确定这是否是最好的解决方案 - 对任何事情都持开放态度。
谁能帮我解决这个问题?
因此,既然您的评论已经表明它是一致的并且始终是最新的,那么您可以使用一些巧妙的小技巧。
首先,os
模块有一个名为 os.listdir(path)
的命令 - 这将为您提供给定目录(上面的“/Users/Ryan”)中文件的文件名。由于开头是一致的并且数字是降序排列的,因此您可以使用内置函数 sorted()
对名称列表进行排序。这将对它们进行排序,使最新的(最高序号,因为数字是可预测的)将排在最后。您可以 list.pop()
关闭最后一个或直接访问它 (list[-1]
) 并用它做您想做的事(移动它等等)。
如果您在同一目录中有额外的 and/or 静态文件,您可能需要过滤以您的事物开头的事物 - 列表理解可以做到这一点;
files_to_check = [name for name in sorted(os.listdir("/Users/...")) if name.startswith("file")]
它会按顺序为您提供每个文件名,只要名称以 "file"
开头即可。你可以让它强制正确的一切,但是你会进入正则表达式,这在这种情况下可能是过大的。