我有很多檔案。有些是檔案,要么是檔案,zip要么是rar檔案。其中一些具有匹配名稱的影像。例如:
d:\\data\\archive1.zip
d:\\data\\archive1.jpg
d:\\data\\archive2.rar
d:\\data\\archive2.png
d:\\data\\archive3.zip [This one doesn't have an image]
影像擴展名是png, jpg, jpeg, webp,gif等。
我需要一種方法來區分具有相同名稱的影像對的檔案和沒有此類影像對的檔案。這些檔案路徑位于字串串列中。我嘗試執行以下僅獲取沒有擴展名的路徑:
for i in range(len(file_path_list)):
print(file_path_list[i])
fname = file_path_list[i].rsplit('.',1)[0]
tosearch_list = list(file_path_list)
tosearch_list.pop(i)
for x in tosearch_list:
if x.rsplit('.',1)[0] == fname:
print(f"{x} is a matching file")
然后對于串列中的每個條目,我將不得不搜索串列中沒有擴展名的剩余條目以找到匹配項。
archive1將不得不搜索串列中的剩余條目并找到具有相同名稱的其他檔案。這些名稱沒有任何特定的順序。這是最快的方法還是有更好的方法?
uj5u.com熱心網友回復:
您可以為 zip 檔案和影像檔案創建一個 dict,并通過 set 操作獲取缺少的名稱。這是一個例子:
file_path_list=[
"d:\\data\\archive1.zip",
"d:\\data\\archive1.jpg",
"d:\\data\\archive2.rar",
"d:\\data\\archive2.png",
"d:\\data\\archive3.zip",
"d:\\data\\some.bad.filename.zip",
]
zip_dict = {}
img_dict = {}
for path in file_path_list:
fname, fext = os.path.splitext(path)
if fext in (".zip", ".rar"):
zip_dict[fname] = path
elif fext in (".jpg", ".png"):
img_dict[fname] = path
zip_no_img_names = set(zip_dict.keys()).difference(set(img_dict.keys()))
soln_files = [zip_dict[k] for k in zip_no_img_names] # ['d:\\data\\archive3.zip']
uj5u.com熱心網友回復:
- 剪掉一個擴展部分(即
.png),最簡單的方法是從結尾向開頭向后移動,直到看到第一個.字符。 - 一旦剪切,保留其中一個
dict或set關鍵是剩余的位置string- 一個沒有擴展名的檔案名,以有效地跟蹤重復。 - 如果找到這樣的重復,那么你就得到了匹配。如果您關心可能以不同組合出現的擴展名和匹配項,您可能希望使用
dict鍵所在的位置和找到的擴展名string型別的值。list例如,如果您同時擁有my_file.png和my_file.txt,my_dict['my_file'] == {'.png', '.txt'}。
uj5u.com熱心網友回復:
以下是如何通過將itertools.groupby()函式與pathlib.Path實體結合使用來保存檔案路徑(以使它們更易于處理)。
該代碼首先將檔案路徑轉換為Path??s,然后通過對它們進行排序并忽略檔案擴展名來對它們進行分組。接下來,它使用groupby()功能將排序串列分組為共享公共路徑的檔案的子串列。完成后,它會列印出每個組以及其中一個是否為影像檔案的指示符。
from itertools import groupby
from pathlib import Path
from pprint import pprint
image_extensions = {'.png', '.jpg', '.jpeg', '.webp', '.gif'}
archive_extensions = {'.zip', '.rar'}
allowed_extensions = image_extensions | archive_extensions
# Raw filepaths in random order.
filepaths = ['d:\\data\\archive1.zip',
'd:\\data\\archive3.zip',
'd:\\data\\archive2.rar',
'd:\\data\\archive2.png',
'd:\\data\\archive1.jpg']
filepaths = [Path(filepath) for filepath in filepaths] # Convert to pathlib.Paths
filepaths = [filepath for filepath in filepaths if filepath.suffix in allowed_extensions]
def sort_key(filepath):
return ''.join(filepath.parts[:-1]), filepath.parts[-1]
filepaths.sort(key=sort_key)
#pprint(filepaths)
def keyfunc(filepath):
return ''.join(filepath.parts[:-1]), filepath.stem
groups = []
for k, g in groupby(filepaths, keyfunc):
groups.append(list(g)) # Append filepath group.
for group in groups:
has_image = any((filepath.suffix in image_extensions) for filepath in group)
print(group, 'Has image' if has_image else 'No image')
樣本輸出:
[WindowsPath('d:/data/archive1.jpg'), WindowsPath('d:/data/archive1.zip')] Has image
[WindowsPath('d:/data/archive2.png'), WindowsPath('d:/data/archive2.rar')] Has image
[WindowsPath('d:/data/archive3.zip')] No image
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/464734.html
