python合并两个属性_合并两个部分包含文件列表及其属性的最有效方法
我有一個系統,該系統運行帶有ls或dir命令的變體的自定義cli,并返回工作目錄中文件和文件夾的列表。
問題是,我可以使用帶標志的命令運行命令,該標志返回文件及其時間戳(創建和最后修改的日期),或者返回一個標志返回文件及其文件大小。沒有辦法在一個cli命令中同時獲得兩者。
獲取時間戳列表時,會進一步復雜化,僅返回一些文件(所有以某些前綴結尾的文件都被忽略了)。這兩個列表均未按任何特定順序排列。
我希望創建一個字典,在一個地方包含每個文件的所有信息。什么是最干凈,最有效和最pythonic的方法?
快速數據樣本:
dir -time給出506個元素的列表。只有(但不是全部)以.ts結尾的文件帶有時間戳。某些文件顯示在列表中,但沒有時間戳,某些文件(例如以.index結尾的任何文件)根本不顯示在列表中。
ch20prefix_20_182.ts 2014-10-22 16:06:20 - 2014-10-22 16:08:51
ch21prefix_21_40.ts 2014-10-14 16:15:42 - 2014-10-14 16:16:51
modinfo_sdk1.23b24L
bs780_ntplatency
ch10prefix_10_237.ts 2014-10-27 11:05:10 - 2014-10-27 11:07:33
ch10prefix_10_277.ts 2014-10-30 14:03:51 - 2014-10-30 14:04:24
video1_6_1.ts
ch11prefix_11_179.ts 2014-10-22 14:53:50 - 2014-10-22 14:56:00`
dir -size給出了967個元素的列表。所有文件都在此處,所有文件都有文件大小。
ch10prefix_10_340.index 159544
ch2prefix_2_705.ts 75958204
0
ch11prefix_11_148.ts 19877616
ch10prefix_10_310.ts 7373924
ch11prefix_11_111.index 17112
ch11prefix_11_278.index 1368
ch2prefix_2_307.ts 6492580
channelConfig.xml.2HD 18144
ch21prefix_21_220.ts 12893604
ch20prefix_20_128.index 1720
亂七八糟有一些押韻和原因,這就是為什么有些文件顯示而另一些文件不顯示,為什么有些文件帶有時間戳而另一些文件沒有的原因,但這與該問題無關。
我對如何處理它的想法:
我想要的最終輸出是一個字典,每個鍵作為文件名,并且它的值是另一個字典,其中包含“創建時間”,“時間調制”和“文件大小”的鍵/值對。這樣一來,您可以輕松查找每個文件的所有3條信息。
但是,對我來說困難的部分是找到一種有效的方法來合并每個列表中的數據。首先想到的是循環瀏覽較大的列表(文件大小),然后對于每個元素,檢查它是否在較小的列表中,以及是否存在(并帶有時間戳),然后添加數據。但這是非常低效的。盡管我事先知道的較大列表中的某些文件在其他列表中沒有時間戳,但是對于所有沒有時間戳的文件,我不能說。
列表未排序,但是我想到,如果按文件名排序,則可以采用一種更快的方式從另一個列表中查找每個文件,但是考慮到對列表進行排序的運行時間,值得付出努力。
那么,這里最有效的方法是什么?我主要關心運行時和可讀性,但是歡迎在我處理該問題的方式中納入其他因素。
解決方案
從您的問題很難說出您想要的結果是什么。如果您想要兩個列表中的所有文件,即使它們僅出現在一個或另一個列表中,則只需對兩個文件進行一次遍歷,然后使用collections.defaultdict
from collections import defaultdict
d = defaultdict(dict)
with open('fileA.txt') as f:
for line in f:
name, time = line[:24], line[24:]
name, time = name.strip(), time.strip()
time_created, time_modified = time.split(' - ')
d[name]['time_created'] = time_created
d[name]['time_modified'] = time_modified
with open('fileB.txt') as f:
for line in f:
name, size = line[:24], line[24:]
name, size = name.strip(), size.strip()
d[name]['size'] = size
如果最終結果僅包括兩個列表中都出現的文件,則對每個列表進行一次遍歷以構造單獨的詞典。
dA = defaultdict(dict)
dB = defaultdict(dict)
with open('fileA.txt') as f:
for line in f:
name, time = line[:24], line[24:]
name, time = name.strip(), time.strip()
try:
time_created, time_modified = time.split(' - ')
except ValueError:
time_created, time_modified = '', ''
dA[name]['time_created'] = time_created
dA[name]['time_modified'] = time_modified
with open('fileB.txt') as f:
for line in f:
name, size = line[:24], line[24:]
name, size = name.strip(), size.strip()
dB[name]['size'] = size
然后,通過其中一個字典,以創建具有公共鍵的第三個字典。
d = defaultdict(dict)
for k, v in dA.items():
if k in dB:
d[k] = v
d[k].update(dB[k])
由于這是迄今為止唯一的解決方案,并且@Brian C沒有提供解決方案,因此這必須是最有效的。
總結
以上是生活随笔為你收集整理的python合并两个属性_合并两个部分包含文件列表及其属性的最有效方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql加上唯一索引后批量插入_MySQL
- 下一篇: html控制浏览器宽度和高度,html