我發現了一些方法來搜索用戶在目錄中創建的最新文件,但我需要確定是否存在更簡單的方法。大多數關於這個主題的帖子在某些情況下都有用,或者有很大的障礙,所以我希望能夠讓這些水不再感冒。獲取不斷更新文件的文件路徑
我在查看不斷增長的文件系統時遇到了困難,並且導致更多用戶遇到更多潛在錯誤。
我從Superlogics Winview CP 32獲取數據以獲得連續流式傳輸系統。在每次使用系統時,我都要求操作員輸入文件名的唯一標識符,其中包含我們需要跟蹤的系統的一些初始條件。我希望在沒有操作員/用戶幫助的情況下獲得該文件名。
最終,最終目標是削減我想要搜索的文件列表,並根據關鍵字進行過濾,因此我的第一本能是隻使用匹配的文件類型,修剪路徑中的所有文件夾到列表中,以及根據最大時間戳進行排序。我用了一些很常見的功能,從這些頁面:
def fileWalkIn(path='.',matches=[],filt='*.csv'): # Useful for walking through a given directory
"""Iterates through all files under the given path using a filter."""
for root, dirnames, filenames in os.walk(path):
for filename in fnmatch.filter(filenames, filt):
matches.append(os.path.join(root, filename))
yield os.path.join(root, filename)
def getRecentFile(path='.',matches=[],filt='*.dat'):
rr = max(fileWalkIn(path=path,matches=matches,filt=filt), key=os.path.getmtime)
return rr
這讓我遠,但比較笨重,緩慢的,這意味着如果我想探索匹配的文件,我不能這樣做反覆,恐怕我得隨身攜帶一大堆匹配的文件。
理想情況下,我可以在運行中處理數據,在寫入時執行和打印實時數據,因此在此情況下此方法不可用。
我從這些頁面借用了一個由alex-martelli創建的不使用過濾器的新方法,它提供了與目錄相對的給出文件的選項,比fileWalkIn小得多,並且如果使用時間戳,則可以更快地工作。
def all_subdirs_of(b='.'): # Useful for walking through a given directory
# Create hashable list of files or directories in the parent directory
results = []
for d in os.listdir(b):
bd = os.path.join(b, d)
if os.path.isfile(bd):
results.append(bd)
elif os.path.isdir(bd):
results.append(bd)
# return both
return results
def newest(path='.'):
rr = max(all_subdirs_of(b=path), key=os.path.getmtime)
return rr
def getActiveFile(newFile ='.'):
while os.path.exists(newFile):
newFile = newest(newFile)
if os.path.isfile(newFile):
return newFile
else:
if newFile:
continue
else:
return newFile
這讓我更快速地訪問目錄中的活動文件,但只有在啓動我的數據收集後才能寫入其他文件。我可以在這裏看到各種各樣的問題,需要一些幫助來確定我是否已經放棄了兔子洞,並且有一個更簡單的解決方案,比如測試文件大小,或者是否存在潛在障礙較小的更有凝聚力的解決方案。
我找到了不同語言的其他答案(java,how-to-get-the-path-of-a-running-jar-file),但在Python中需要一些東西。我探索了watchdog和win32等功能,但都需要陡峭的學習曲線,而且我覺得我要麼非常接近,要麼完全改變我的範例。