校验光盘--python中的字典的值两两求交集

danny posted @ 2014年2月27日 23:58 in python with tags python 光盘校验 , 2543 阅读

问题的由来: 刻录了一百多张光盘, 记录了每一张光盘的目录数(光盘根目录下的一层子目录), 发现光盘目录数总和大于源数据目录数. 应该是 一个目录只能刻录在一张光盘上, 所有光盘下目录总数等于源数据目录总数, 不多不少

于是得校验到底是哪些光盘里的目录是重复了. 光盘有相应的标签...

如果是一台机依次读取一百来个光盘,那还真够呛的. 所以,得分开来读,得到一些原始数据再合并对比. 标识光盘,当然是其标签, 已经确定了,标签不存在重复. 所以,我想到用字典来处理.

#!/usr/bin/env python3
#coding=gbk
import os
import ctypes
import win32api

def get_write():
    cdrom = "E:"
    k = win32api.GetVolumeInformation(cdrom)[0]
    dirs = os.listdir(cdrom)
    ctypes.windll.WINMM.mciSendStringW(u"set cdaudio door open", None, 0, None)
    print("光驱已经弹出, 请换光盘继续")
    return (k, dirs)

mydict = {}
ans = input("装光盘放入光驱后, 按回车键继续\n>")
while ans != 'q':
    k, v = get_write()
    mydict[k] = v
    ans = input("装光盘放入光驱后, 按回车键继续,输入q退出\n>")

for k, v in mydict.items():
    print(k, v)

字典的键是光盘标签, 键值是目录列表

cdrom 暂时定为E盘, 还找到获取第一个光驱的盘符的办法

暂存的数据还没想到采用什么样的结构比较合适. 

dict = {'k': [...]}

字典=>文件, 然后再由文件=>字典

当然,如果几个python程序之间能够通讯或者说有一个服务端来集中处理的提交的数据是极好的. 依然存在一个问题,如何交换数据.

据说, json是一个不错的尝试...可是,我还没开始研究.

先这样了, 明天再看.

2-28 补: 睡了一晚,问题搞定.

#!/usr/bin/env python3
#coding=gbk
import os
import ctypes
import win32api
import pickle

def get_write():
    cdrom = "F:"
    cdrom = "E:"
    k = win32api.GetVolumeInformation(cdrom)[0]
    dirs = os.listdir(cdrom)
    ctypes.windll.WINMM.mciSendStringW(u"set cdaudio door open", None, 0, None)
    print("%s 光驱已经弹出, 请换光盘继续" % k)
    return (k, dirs)

def main(fn):
    ctypes.windll.WINMM.mciSendStringW(u"set cdaudio door open", None, 0, None)
    mydict = {}
    ans = input("装光盘放入光驱后, 按回车键继续\n>")
    #ctypes.windll.WINMM.mciSendStringW(u"set cdaudio door closed", None, 0, None)
    while ans != 'q':
        k, v = get_write()
        mydict[k] = v
        pickle.dump(mydict, open(k, 'wb'))
        ans = input("装光盘放入光驱后, 按回车键继续,输入q退出\n>")
        #ctypes.windll.WINMM.mciSendStringW(u"set cdaudio door closed", None, 0, None)
    
    pickle.dump(mydict, open(fn, 'wb'))
    read_pickle(fn)

def read_pickle(fn):
    mydict = pickle.load(open(fn, 'rb'))
    return mydict

def combine_dict(x, y):
    z = x.copy
    z.update(y)
    return z

def diff_each(mydict):
    newdict = {}
    for k0, v0 in mydict.items():
        for k1, v1 in mydict.items():
            myset = set(v0).intersection(set(v1))
            if myset:
                newdict["%s_%s" % (k0, k1)] = myset
    pickle.dump(mydict, open('diff.txt', 'w'))
    return newdict

if __name__ == '__main__':
    fn = 'save.p'
    main(fn) 
   #print(diff_each(combine_dict(read_pickle('save.p1'), read_pickle('save.p2'))))

 

参考资料:

1. http://forum.xbmc.org/showthread.php?tid=77743

2. http://stackoverflow.com/questions/3174349/how-to-eject-cd-using-wmi-and-python


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter