亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 6959 | 回復: 13
打印 上一主題 下一主題

大量序列幀掃描 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-01-16 08:19 |只看該作者 |倒序瀏覽
20可用積分
本帖最后由 liaozd 于 2014-01-16 08:47 編輯

文件目錄大致可能是這樣:

folder1
    |-----name0000.jpg
    |-----name0000.tif
    |-----name0001.jpg
    |-----name0001.tif
    |-----....   
    |-----....
    |-----name2000.jpg
    |-----name2000.tif
    |-----name2004.tif
    |-----name2501.tif
    |-----....
    |-----name2845.tif
    |-----other_file.txt
    |-----folder2
                 |-----name0000.jpg
                 |-----name0000.tif
                 |-----name0001.jpg
                 |-----name0001.tif
                 |-----....   
                 |-----....
                 |-----name2000.jpg
                 |-----name2000.tif
                 |-----other_file2.sh
說明:

  序列幀不限于僅僅是jpg或tif,還可能有dpx或exr
  目錄里面會有多級子目錄
  總幀數(shù)可能會上萬,所以掃描速度是個問題

我怎么能夠得到這樣輸出結果?

輸出結構:
  folder1: name0000-2000.jpg, 340MB
  folder1: name0000-2000.tif, 1GB
  folder1: name2004-2845.tif, 500MB
  folder1: other_file.txt, 1k
  folder1/folder2: name0000-2000.jpg, 340MB
  folder1/folder2: name0000-2000.tif, 1GB
  folder1/folder2: other_file2.sh, 45byte


最佳答案

查看完整內(nèi)容

回復 1# liaozd 主要功能OK,代碼的注釋和文檔說明了實現(xiàn)細節(jié)。另外,在程序正確運行之前,過早優(yōu)化性能是多余且有害的。在safari/chrome里,CU的代碼標簽有問題,代碼以我附件內(nèi)容為準。保存為test.py,運行:

論壇徽章:
11
技術圖書徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [報告]
發(fā)表于 2014-01-16 08:19 |只看該作者
本帖最后由 timespace 于 2014-01-17 10:46 編輯

回復 1# liaozd
主要功能OK,代碼的注釋和文檔說明了實現(xiàn)細節(jié)。另外,在程序正確運行之前,過早優(yōu)化性能是多余且有害的。
在safari/chrome里,CU的代碼標簽有問題,代碼以我附件內(nèi)容為準。
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-

  3. import itertools
  4. import os
  5. import re
  6. import sys
  7. from os.path import getsize, isdir, isfile, join, splitext

  8. class KeyTracker(object):
  9.     """有狀態(tài)的KEY生成器。
  10.    
  11.     給定一個KEY,保存對應一組序列中的兩個字段:
  12.      -- 第一個記錄
  13.      -- 當前迭代的上一個記錄
  14.     """
  15.     def __init__(self):
  16.         self.start = self.prev = None

  17.     def key(self, e):
  18.         if self.prev is not None and \
  19.                 self.prev[1] == e[1] and \
  20.                 self.prev[2] == e[2] and \
  21.                 self.prev[3] is not None and \
  22.                 int(self.prev[3]) + 1 == int(e[3]):
  23.             self.prev = e
  24.             return self.start[1:]
  25.         else:
  26.             self.start = self.prev = e
  27.             return e[1:]
  28. def main():
  29.     if len(sys.argv) != 2 or not isdir(sys.argv[1]):
  30.         sys.exit(sys.argv[0] + ' target_dir')

  31.     target = sys.argv[1]
  32.     # alphanum = ......  這行內(nèi)容與CU的代碼標簽沖突,以附件內(nèi)容為準。
  33.     for root, dirs, files in os.walk(target):
  34.         # 為了后續(xù)排序和分類方便,將文件名擴展為如下tuple數(shù)組
  35.         # dummy_files = [(完整文件名, 擴展名, 文件名前綴,文件名數(shù)字后綴), ...]
  36.         # 例如'name0012.jpg'會轉(zhuǎn)換為('name0012.jpg', '.jpg', 'name', '0012')
  37.         # 例如'test.sh'會轉(zhuǎn)換為('test.sh', '.sh', 'test', None)
  38.         dummy_files = []
  39.         for name in files:
  40.             prefix, ext = splitext(name)
  41.             res = alphanum.match(prefix)
  42.             if res is None:
  43.                 dummy_files.append(tuple([name, ext, prefix, None]))
  44.             else:
  45.                 dummy_files.append(tuple([name, ext, res.group(1), res.group(2)]))

  46.         # 以(擴展名, 文件名前綴,文件名數(shù)字后綴)為key進行排序,
  47.         # 而tuple隱含的排序規(guī)則就是按字段順序優(yōu)先級遞減,正好符合需求。
  48.         dummy_files.sort(key=lambda e: e[1:])

  49.         # 對數(shù)組元素分類,‘文件名數(shù)字后綴’連續(xù)的文件需合并, 是一個有狀態(tài)key,
  50.         # 此處groupby的key隱含的排序穩(wěn)定性必須與上述的sort一致。
  51.         groupkey = KeyTracker()
  52.         for k,g in itertools.groupby(dummy_files, key=groupkey.key):
  53.             total_size = 0
  54.             for idx, item in enumerate(g):
  55.                 filename = join(root, item[0])
  56.                 if isfile(filename):
  57.                     total_size += getsize(filename)
  58.             name = item[0] if idx == 0 else '{}{}-{}{}'.format(k[1], k[2], item[3], k[0])
  59.             print '{}: {}, {} bytes'.format(root, name, total_size)

  60. if __name__ == '__main__':
  61.     main()
  62.                      
復制代碼
保存為test.py,運行:
  1. bash-3.2 $python --version
  2. Python 2.7.5
  3. bash-3.2 $./test.py folder1/
  4. folder1/: name01-02.jpg, 69 bytes
  5. folder1/: name01-02.tif, 16 bytes
  6. folder1/: name10-12.tif, 36 bytes
  7. folder1/: file.txt, 16 bytes
復制代碼

test.py.gz

1.23 KB, 下載次數(shù): 1763

論壇徽章:
33
榮譽會員
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT運維版塊每日發(fā)帖之星
日期:2016-04-17 06:23:27操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-24 06:20:0015-16賽季CBA聯(lián)賽之天津
日期:2016-05-06 12:46:59
3 [報告]
發(fā)表于 2014-01-16 09:42 |只看該作者
基本上就是個 目錄的 io 操作, 能不能快, 看你的硬盤了.

論壇徽章:
0
4 [報告]
發(fā)表于 2014-01-16 09:46 |只看該作者
用GO語言吧。。。。嘿嘿

論壇徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白銀圣斗士
日期:2015-11-17 15:13:0815-16賽季CBA聯(lián)賽之新疆
日期:2016-04-01 09:10:58
5 [報告]
發(fā)表于 2014-01-16 09:57 |只看該作者
回復 1# liaozd


    可以考慮使用 os.walk() 來得到所有項進行遍歷。
    這時需要做的就是:
    1. 根據(jù)你需要的文件擴展名進行過濾
    2. 記錄文件的路徑、文件、大小信息。

論壇徽章:
0
6 [報告]
發(fā)表于 2014-01-16 10:16 |只看該作者
我想過難度可能在這里:“文件名.擴展名”,先進性一次排序,文件名相同但擴展名不同的會混在一起,我可能還需要對擴展名進行二次排序,這樣好像非常影響速度。

論壇徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白銀圣斗士
日期:2015-11-17 15:13:0815-16賽季CBA聯(lián)賽之新疆
日期:2016-04-01 09:10:58
7 [報告]
發(fā)表于 2014-01-16 10:39 |只看該作者
本帖最后由 icymirror 于 2014-01-16 10:41 編輯

回復 5# liaozd


    可以考慮把允許的擴展名寫入到一個 dict 或者 set, 然后用 index 等方法來確定是否存在來(寫成一個函數(shù)對一個文件名進行擴展名過濾)。
    然后,把這個方法用 map 或者 filter 來映射到數(shù)據(jù)集上進行過濾。
    同時,這種方式?jīng)Q定了不需要排序之類的過程。

論壇徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龍
日期:2014-08-08 09:28:02獅子座
日期:2014-09-14 20:32:05
8 [報告]
發(fā)表于 2014-01-16 10:39 |只看該作者
回復 5# liaozd


    不太明白,為什么要對擴展名進行二次排序呢?先排序,然后以擴展名為鍵值作一個字典,記錄文件名,文件名自然就是已經(jīng)排好的順序。而且排序又很快,跟讀取文件信息花的時間相比,排序還是比較快的。

論壇徽章:
33
榮譽會員
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT運維版塊每日發(fā)帖之星
日期:2016-04-17 06:23:27操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-24 06:20:0015-16賽季CBA聯(lián)賽之天津
日期:2016-05-06 12:46:59
9 [報告]
發(fā)表于 2014-01-16 10:40 |只看該作者
回復 5# liaozd


不需要排兩次.

以目錄為單位來處理, glob 就可以拿到所有的當前目錄下的目錄和文件, 只處理目錄下的文件, 子目錄調(diào)用函數(shù)繼續(xù)處理.

每個文件名存入以擴展名為名的數(shù)組, 然后, 排序一次這個數(shù)組就可以了. 之后對排序后的數(shù)組做處理, stat 每個文件的大小, 把名字連續(xù)的文件的大小加起來就行了.

效率還真是說不上怎么快.  如果你的硬盤夠好, 建議用多進程來處理吧. 使用中間文件來交換信息.

論壇徽章:
0
10 [報告]
發(fā)表于 2014-01-16 11:06 |只看該作者
回復 3# xmchenb

go做這個會容易一些么?

   
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP