我有這個代碼,它可以作業。但我想獲得兩個不同的檔案。
file_type回傳NP或KL。所以我想得到最大值的NP檔案,我想得到最大值的KL檔案。
字典看起來像
{"Blah_Blah_NP_2022-11-01_003006.xlsx": "2022-03-11",
"Blah_Blah_KL_2022-11-01_003006.xlsx": "2022-03-11"}
這是我的代碼,現在我只是得到最大日期而不考慮時間。由于日期的格式是這樣的,而且我不關心時間,我可以使用max().
我無法擴展以下代碼以提供最大的 NP 檔案和最大的 KL 檔案。同樣,file_type從檔案名回傳 NP 或 KL 字串。
file_dict = {}
file_path = Path(r'\\place\Report')
for file in file_path.iterdir():
if file.is_file():
path_object = Path(file)
filename = path_object.name
stem = path_object.stem
file_type = file_date = stem.split("_")[2]
file_date = stem.split("_")[3]
file_dict.update({filename: file_date})
newest = max(file_dict, key=file_dict.get)
return newest
我基本上想要newestwhere file_type=NP和newestwhere file_type=KL
uj5u.com熱心網友回復:
您可以將字典過濾成兩個字典(或者,如果有更多型別,則需要多個字典),然后獲取其中任何一個的最大日期。
但是整個操作只需幾行就可以有效地完成:
from pathlib import Path
from datetime import datetime
def get_newest():
maxs = {}
for file in Path(r'./examples').iterdir():
if file.is_file():
*_, t, d, _ = file.stem.split('_')
d = datetime(*map(int, d.split('-')))
maxs[t] = d if t not in maxs else max(d, maxs[t])
return maxs
print(get_newest())
這個:
- 將每種型別的最大日期收集到一個
dictmaxs - 像您一樣回圈檔案(但在我按照您的模式創建一些示例的位置)
- 只查看檔案,例如您的代碼
- 假設檔案都符合您的模式,并將它們拆分
'_',僅將倒數第二部分保留為日期,將其之前的部分保留為型別 - 將日期轉換為
datetime物件 - 保留新日期或先前存盤的日期(如果有),以較大者為準
結果:
{'KL': datetime.datetime(2023, 11, 1, 0, 0), 'NP': datetime.datetime(2022, 11, 2, 0, 0)}
檔案夾中的檔案:
Blah_Blah_KL_2022-11-01_003006.txt
Blah_Blah_KL_2023-11-01_003006.txt
Blah_Blah_NP_2022-11-02_003051.txt
Blah_Blah_NP_2022-11-01_003006.txt
Blah_Blah_KL_2021-11-01_003006.txt
在你問的評論中
不知道上面的代碼如何獲取差異檔案型別和最大值。它只是在尋找所有的差異型別嗎?很難知道每件作品的名稱如 s、d、t 等。在 *_、t、d、_ = 和 d = datetime(*map(int, d.split('-') ))
這是一個公平的觀點,當我認為含義明確時,我更喜歡短名稱,但描述性名稱可能會更好。t是為了type(并且type會是一個壞名字,陰影type,所以也許file_type)。d是 fordate或dtfor datetime 可能會更好。我沒看到s?
這*_, t, d, _ = 被稱為“擴展元組解包”,它從后面的結果中獲取所有結果,只保留第 3 和第 2 到最后,分別為t和d,并丟棄其余的。_占據一個位置,但下劃線表示我們“不關心”該位置的任何內容。正如鏈接的 PEP 文章中所解釋的*_,同樣在開始時會吞噬所有值。
d = datetime(*map(int, d.split('-')))最好由內而外閱讀。d.split('-')只需要一個日期字串'2022-11-01'并將其拆分。應用于結果的將函式map(int, ...)應用于該結果的int()每個部分 - 所以它('2022', '11', '01')變成(2022, 11, 1). 前面*的map()將結果作為引數傳播到datetime- 所以,datetime(2022, 11, 1)在本例中將被呼叫。
這就是我對 Python 既喜歡又討厭的地方——隨著你越來越擅長它,有非常簡潔(并且可以說是漂亮——用戶 @ArtemErmakov 似乎同意)的方法來撰寫干凈的解決方案。但是除非您了解該語言的大部分基礎知識,否則它們會變得難以閱讀。對于初學者來說,它們不容易理解,這可以說是一種語言的一個壞特性。
回答更廣泛的問題:由于回圈獲取每個檔案,從中獲取型別(如“KL”)并獲取日期,然后它可以檢查字典,如果型別是新的,或者型別是已經在字典中,用兩者中的最大值更新它,這就是這一行的作用:
maxs[t] = d if t not in maxs else max(d, maxs[t])
我建議您繼續提問 - 每當您看到類似此代碼的內容時,請嘗試將其分解為所有小部分,并查看您不理解的具體部分。Python 是一種強大的語言。
作為獎勵,這是相同的解決方案,但寫得更清楚一點以顯示發生了什么:
from pathlib import Path
from datetime import datetime
def get_newest_too():
maximums = {}
for file_path in Path(r'./examples').iterdir():
if file_path.is_file():
split_file = file_path.stem.split('_')
file_type = split_file[-3]
date_time_text = split_file[-2]
date_time_parts = (int(part) for part in date_time_text.split('-'))
date_time = datetime(*date_time_parts) # spreading is just right here
if file_type in maximums:
maximums[file_type] = max(date_time, maximums[file_type])
else:
maximums[file_type] = date_time
return maximums
print(get_newest_too())
編輯:從評論中可以清楚地看出,您在選擇每個特定型別的實際檔案時遇到了麻煩,而日期是該型別的最大值。
以下是如何做到這一點:
from pathlib import Path
from datetime import datetime
def get_newest():
maxs = {}
for file in Path(r'./examples').iterdir():
if file.is_file():
*_, t, d, _ = file.stem.split('_')
d = datetime(*map(int, d.split('-')))
maxs[t] = (d, file) if t not in maxs else max((d, file), maxs[t])
return {f: d for _, (d, f) in maxs.items()}
print(get_newest())
結果:
{WindowsPath('examples/Blah_Blah_KL_2023-11-01_003006.txt'): datetime.datetime(2023, 11, 1, 0, 0), WindowsPath('examples/Blah_Blah_NP_2022-11-02_003051.txt'): datetime.datetime(2022, 11, 2, 0, 0)}
uj5u.com熱心網友回復:
您可以構建另一個dict僅包含您需要的專案:
file_dict_NP = {key:value for key, value in file_dict.items() if 'NP' in key}
然后對它做同樣的事情:
newest_NP = max(file_dict_NP, key=file_dict_NP.get)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528192.html
標籤:Python字典最大限度
上一篇:如何將嵌套字典與資料框合并?
下一篇:如何在顫振中使用動態地圖名稱
