日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python合并两个属性_合并两个部分包含文件列表及其属性的最有效方法

發(fā)布時間:2024/7/19 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python合并两个属性_合并两个部分包含文件列表及其属性的最有效方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我有一個系統(tǒng),該系統(tǒng)運行帶有l(wèi)s或dir命令的變體的自定義cli,并返回工作目錄中文件和文件夾的列表。

問題是,我可以使用帶標志的命令運行命令,該標志返回文件及其時間戳(創(chuàng)建和最后修改的日期),或者返回一個標志返回文件及其文件大小。沒有辦法在一個cli命令中同時獲得兩者。

獲取時間戳列表時,會進一步復雜化,僅返回一些文件(所有以某些前綴結尾的文件都被忽略了)。這兩個列表均未按任何特定順序排列。

我希望創(chuàng)建一個字典,在一個地方包含每個文件的所有信息。什么是最干凈,最有效和最pythonic的方法?

快速數(shù)據(jù)樣本:

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

亂七八糟有一些押韻和原因,這就是為什么有些文件顯示而另一些文件不顯示,為什么有些文件帶有時間戳而另一些文件沒有的原因,但這與該問題無關。

我對如何處理它的想法:

我想要的最終輸出是一個字典,每個鍵作為文件名,并且它的值是另一個字典,其中包含“創(chuàng)建時間”,“時間調制”和“文件大小”的鍵/值對。這樣一來,您可以輕松查找每個文件的所有3條信息。

但是,對我來說困難的部分是找到一種有效的方法來合并每個列表中的數(shù)據(jù)。首先想到的是循環(huán)瀏覽較大的列表(文件大小),然后對于每個元素,檢查它是否在較小的列表中,以及是否存在(并帶有時間戳),然后添加數(shù)據(jù)。但這是非常低效的。盡管我事先知道的較大列表中的某些文件在其他列表中沒有時間戳,但是對于所有沒有時間戳的文件,我不能說。

列表未排序,但是我想到,如果按文件名排序,則可以采用一種更快的方式從另一個列表中查找每個文件,但是考慮到對列表進行排序的運行時間,值得付出努力。

那么,這里最有效的方法是什么?我主要關心運行時和可讀性,但是歡迎在我處理該問題的方式中納入其他因素。

解決方案

從您的問題很難說出您想要的結果是什么。如果您想要兩個列表中的所有文件,即使它們僅出現(xiàn)在一個或另一個列表中,則只需對兩個文件進行一次遍歷,然后使用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

如果最終結果僅包括兩個列表中都出現(xiàn)的文件,則對每個列表進行一次遍歷以構造單獨的詞典。

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

然后,通過其中一個字典,以創(chuàng)建具有公共鍵的第三個字典。

d = defaultdict(dict)

for k, v in dA.items():

if k in dB:

d[k] = v

d[k].update(dB[k])

由于這是迄今為止唯一的解決方案,并且@Brian C沒有提供解決方案,因此這必須是最有效的。

總結

以上是生活随笔為你收集整理的python合并两个属性_合并两个部分包含文件列表及其属性的最有效方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。