实习 week(一)

一、环境搭建:

1、Python+Pycharm

2、Phpstudy:该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境·该程序不仅包括PHP调试环境,还包括了开发工具、开发手册等·总之学习PHP只需一个包。

二、操作平台

Windows+Linux(服务器)

Xshell:windows下SSH远程登录Linux软件。一个强大的安全终端模拟软件,它支持SSH1、SSH2以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色,帮助用户在复杂的网络环境中享受他们的工作。Xshell适合于初级用户和高级用户。它的界面友好,为高级用户提供了更强大的功能。

三、Linux命令及MySQL

Linux:

wget:下载

unzip:解压zip文件

less:查看文档

ls:查看当前文件夹下的所有文件

tree:当前文件夹下的目录缩进列表

tree命令行参数:
-a 显示所有文件和目录。
-A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。
-C 在文件和目录清单加上色彩,便于区分各种类型。
-d 显示目录名称而非内容。
-D 列出文件或目录的更改时间。
-f 在每个文件或目录之前,显示完整的相对路径名称。
-F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","=","@","|"号。
-g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
-i 不以阶梯状列出文件或目录名称。
-I 不显示符合范本样式的文件或目录名称。
-l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
-n 不在文件和目录清单加上色彩。
-N 直接列出文件和目录名称,包括控制字符。
-p 列出权限标示。
-P 只显示符合范本样式的文件或目录名称。
-q 用"?"号取代控制字符,列出文件和目录名称。
-s 列出文件或目录大小。
-t 用文件和目录的更改时间排序。
-u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
-x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。

MySQL:

查看数据库(DB)、表(TB)的信息:show databases; show tables;先使用USE DB名进入数据中才可以查看表列。

创建DB、TB:CREATE DATABASE DB名;       CREATE TABLE TB名;

增(加入):INSERT INTO  表名(属性字段)VALUES(字段对应的值)

删:DROP TABLE TBNAME;(释放空间)DELETE *FROM TBNAME ;(不释放空间)

改:UPDATE TBNAME SET 字段=字段值

查:SELECT *FROM  TB  ;表示对整张表的查看

       SELECT  属性字段 FROM TB;表示对表中的某一字段的查看

       SELECT DISTINCT:查看表中无重复的。

       SELECT ...........WHERE  字段操作条件(逻辑:and ,or,not;比较:=,>,<,>=,<=,!=,(<>) 特殊:is null,between and ,in ,like(匹配%表任意,-表相同的))

 ORDER BY:对某字段排序查看,默认升序(ASC);降序:DESC

四、加密方法(校验文件)

MD5:  即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一  ,主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理。

MD5算法具有以下特点:

1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。

2、容易计算:从原数据计算出MD5值很容易。

3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式

五、任务

cms版本识别提取模块

从phpmyadmin的若干版本源码包中,找出一个路径(包括文件名),该路径大多数源码包中都包含,并且md5值不一样,寻找的文件类型为css或js
程序输出:
{
 "url": "/test/test.css",
 "data": {
  "xxxversion": "32位md5",
  "yyyversion": "32位md5"
 }

}

phpmyadmin版本网址: https://github.com/phpmyadmin/phpmyadmin/releases

在服务器中用wget命令下载各版本的phpmyadmin,使用unzip解压Zip压缩包。

使用命令:find ./phpmyadmin-RELEASE_4_6_6/ -regextype posix-extended -regex ".*\.(css|js)" -exec md5sum {} \;>filename.txt

命令解释:

find命令查找当前目录下phpmyadmin-RELEASE_4_6_6文件夹下

regextype posix-extended :正则类型为posix-extended

-regex ".*\.(css|js)":找到后缀名为css和js文件

-exec :选项后面跟随着所要执行的命令或脚本,然后是一对儿 {},一个空格和一个\,最后是一个分号

md5sum:计算文件的MD5------命令行终端直接执行

>filename.txt:执行结果保存到改文件中

下载了16个版本计算出各版本对应的MD5保存在txt文件中。

version information:

0.txt---466
1.txt---401020
2.txt---470
.......
.......
12---480
13---4801
14---481
15---482

代码:

对数据分割重组---all_file_to_merge_1.py

#对数据分割重组
import re

#--------------创建all_file_merge.txt----V/P:MD5-----------
#所有版本内容合并: V/P:md5
all_file_to_dict={}
for i in range(16):
    filepath='Data/'+str(i)+'.txt'
    file=open(filepath,'r')

    for line in file.readlines():
        key,value=line.strip().split('./')
        all_file_to_dict[value]=key

all_file_merge=open('txt/all_file_merge.txt','w')
for (key,value) in all_file_to_dict.items():
    all_file_merge.write('%s:%s\n'%(key,value))


#------------创建path_md5.txt---P:MD5------------
list=[]
for i in range(16):
    filepath = 'Data/' + str(i) + '.txt'
    file = open(filepath, 'r')
    dict={}
    for line in file.readlines():
        key,value=line.strip().split('./')
        value=value[::-1]
        match=re.match('.*/',value)
        value=match.group()[::-1]
        dict[value]=key
    list.append(dict)

path_ma5=open('txt/path_md5.txt','w')
for i in range(16):
    for key,value in list[i].items():
        path_ma5.write('%s:%s\n'%(key,value))


#--------------创建version_md5.txt-V:MD5---------------
file=open('txt/all_file_merge.txt','r')
version_md5=open('txt/version_md5.txt','w')
for line in file.readlines():
    key1,value1=line.strip().split('/',1)
    key2,value2=line.strip().split(':')
    version_md5.write('%s:%s\n'%(key1,value2))


#文件排序--path_md5_sort_2.py
#文件排序
file=open('txt/path_md5.txt','r')
#对path_md5排序:结果写入path_md5_sort.txt文件中
list=[]
for line in file.readlines():
    list.append(line)

# print(len(list))

list.sort()#返回值是None,其表示是在原对象上进行的操作。返回排序后结果意味着创建了一个副本。
# print(len(list))

file_sort=open(r'txt/path_md5_sort.txt','w')
for l in range(len(list)):
    file_sort.write('%s'%(list[l]))




找到相同文件下的路径---find_16_samepath_file_3.py

#小心:在同一个文件中不能写读同一个文件,否则读会出错

#找到16个文件中共同的文件
find_file=open(r'txt/path_md5_sort.txt','r')


path_list=[]
# countx=0
for line in find_file.readlines():
    (path,value)=line.strip().split(':')
    path_list.append(path)
    # countx+=1
# print(path_list)
# print(countx)

#记录16个相同路径的第一个序号:与源文件少1,是因为列表从0开始遍历而源文件是从1开始计数
record_num=[]
# print(len(path_list))
for i in range(len(path_list)):
    # print(i)
    count=i+15
    if count<len(path_list) and path_list[i]==path_list[count]  :
        record_num.append(i)
    # print(path_list[i])
# print(record_num)

找到相同文件下文件位置----find_16_samepath_file_position_4.py

import find_16_samepath_file_3


find_file_=open(r'txt/path_md5_sort.txt','r')
list=[]
list_=[]

# for i in range(len(sort_process.record_num)):
#     for line in find_file_.readlines()[sort_process.record_num[i]:sort_process.record_num[i]+16]:
#         list.append(line)
#     # list_.append(list)
# print(list_)

num=0
i=0
count=0
for line in find_file_.readlines():
    if num<len(find_16_samepath_file_3.record_num) and i>=find_16_samepath_file_3.record_num[num] and i<=find_16_samepath_file_3.record_num[num]+15  :
        list_.append(line)
        count+=1
        # print(line)
    if(count==16):#计数到16时,count归0,并且列表指向下一个元素
        num+=1
        count=0
    i+=1

print('获得文件数量:',len(find_16_samepath_file_3.record_num))
print('存储的序号:\n',find_16_samepath_file_3.record_num)

print('列表元素个数:',len(list_))

finded_file=open('txt/finded.txt','w')
for i in range(len(list_)):
    finded_file.write('%s'%list_[i])

找到相同文件路径不同的MD5值----find_16_samepath_different_md5_5.py

file=open('txt/finded.txt','r')
list=[]

for line in file.readlines():
    path,md5=line.strip().split(':',1)
    list.append(line)
# print(len(list))

md5_list=[]
num=0
for i in range(len(list)):
    # for j in range(16):
        if i+1<len(list) and list[i]==list[i+1]:
            continue
        else:
            md5_list.append(list[i])

# print(md5_list)

find_different_md5=open('txt/find_different_md5.txt','w')
for i in range(len(md5_list)):
    find_different_md5.write('%s'%md5_list[i])

相同路径的文件不同的MD5值-----samepath_file_different_md5_6.py

file=open('txt/find_different_md5.txt','r')

list=[]
#读取文本中的内容将路径保存在list中方便后面统计相同路径的数目
for line in file.readlines():
    key,value=line.strip().split(':')
    list.append(key)

print(len(list))


count=1
num=0
tmp=list[0]
list_num=[]
path=''
dict={}
#用list_num记录列表中相同路径下的MD5不同的数量,并且将路径+数量保存到字典中
for i in range(1,len(list)):
    if(list[i]==tmp):
        count+=1
    else:
        list_num.append(count)
        dict[tmp]=count
        tmp=list[i]
        count=1

print(list_num)
print(len(list_num))
for (key,value) in dict.items():
    print(key,value)
    num+=1
print(num)

# 找到列表中的最大值,并判断最大值个数
max_list_num=max(list_num)

print(max_list_num)
# count_max=0
# for i in range(len(list_num)):
#     if(list_num[i]==max(list_num)):
#         count_max+=1

# 找到最大的数(MD5不同),将对应的路径及MD5以key,value形式保存在字典中
dict_result={}
for path,num in dict.items():
    if(num==max(list_num)):
        dict_result[path]=num


print("fined the result:")
for path,num in dict_result.items():
    print(path,num)

# dict_to_list=list(dict_result)

#将记录的路径保存在列表中
list_path=[]
for path,num in dict_result.items():
    list_path.append(path)

# print(list_path)


## 记录需要文件的数量
need_file_num=len(list_path)
print(need_file_num)


找到最终所要的路径及MD5值----final_path_md5_7.py

import samepath_file_different_md5_6

file=open('txt/find_different_md5.txt','r')

num=0
count=0
list_path_md5=[]
# print(len(same_file_different_md5.list_path))

# 从所有的相同路径不同MD5文件中遍历
for line in file.readlines():
    # print(line)
    path,md5=line.strip().split(':')
    # print(key)
    #相同路径下含有最多不同的MD5的内容
    if num<len(samepath_file_different_md5_6.list_path) and (path==samepath_file_different_md5_6.list_path[num]):
        list_path_md5.append(line)
        count+=1
    #当计数到同文件下不同MD5的最大数量时,num++即遍历列表中的下一个保存路径
    if count==samepath_file_different_md5_6.max_list_num:
        num+=1

print(list_path_md5)

# 将找到的内容保存起来
P_M=open('txt/final_path_md5.txt','w')
for i in range(len(list_path_md5)):
    P_M.write('%s\n'%list_path_md5[i].strip())





找到文件路径和MD5所对应的版本----final_version_path_md5_8.py

import final_path_md5_7

file1=open('txt/version_md5.txt','r')


list=[]
# 用MD5来找对应的版本,然后将version+path+md5保存到列表中
for line in file1.readlines():
    version,md5=line.strip().split(':')
    for i in range(len(final_path_md5_7.list_path_md5)):
        path,md5_=final_path_md5_7.list_path_md5[i].strip().split(':')
        if md5==md5_:
            list.append(version+final_path_md5_7.list_path_md5[i])

print(list)
# 将version+path+文本中md5写入
final_result=open('txt/final_result.txt','w')
for i in range(len(list)):
    final_result.write('%s\n'%list[i].strip())

最终输出结果-----output_final_result_9.py

import samepath_file_different_md5_6

file=open('txt/final_result.txt','r')

#list中保存了16*samepath_file_different_md5_6.need_file_num个文件
list=[]
for line in file.readlines():
    list.append(line)

# print(len(list))

list.sort()
for i in range(len(list)):
    print(list[i].strip())


save_final_output=open('txt/final_output.txt','w')
num=0
print('output_result:')
#一般性,可能含有多个相同的最大的MD5数量
# 遍历有可能多个MD5的不同数量即符合要求多于1个其数量为samepath_file_different_md5_6.need_file_num
for i in range(samepath_file_different_md5_6.need_file_num):
    key,value=list[num].strip().split(':')#分割version_path:MD5,初始标志
    print('{')

    save_final_output.write('{\n')

    # vp,md5=key.strip().split(':')
    ver,path=key.strip().split('/',1)#分割version:path
    print('  url:',path)
    save_final_output.write('  url:%s\n'%path)

    print('  {\n    data:\n    {')
    save_final_output.write('  {\n    data:\n    {\n')

    for j in range(num+1,(i+1)*16):#
        key1,value1=list[j].strip().split(':')
        if(value==value1):#与前一个MD5对比,相同跳过
            continue
        else:
            version,mad5=key.strip().split('/',1)#MD5不同,记录初始位置的V_M

            print('        ',version,':',value)
            save_final_output.write('        %s:%s\n'%(version,value))

            key,value=key1,value1 #更新比较的值

    num = num+16
    key2,value2=list[num-1].strip().split(':')#最后一个
    version_, mad5_= key2.strip().split('/', 1)

    print('        ',version_, ':', value)
    save_final_output.write('        %s:%s\n' % (version_, value))

    print('    }')
    save_final_output.write('    }\n')

print('  }')
save_final_output.write('  }\n')
# print(samepath_file_different_md5_6.max_list_num)




# #特殊性:只有一个最大的MD5数量
# key,value=list[0].strip().split(':')
# print('{')
# # vp,md5=key.strip().split(':')
# v,p=key.strip().split('/',1)
# print('url:',p)
# print('{\n    data:\n    {')
# for j in range(1,len(list)):
#     key1,value1=list[j].strip().split(':')
#     if(value==value1):
#         continue
#     else:
#         version,mad5_=key.strip().split('/',1)
#         print('        ',version,':',value)
#         key,value=key1,value1
#
# key1,value1=list[len(list)-1].strip().split(':')
# version, mad5= key1.strip().split('/', 1)
# print('        ',version, ':', value)
# print('    }')

print('}')
save_final_output.write('}\n')

输出结果:

phpmyadmin-RELEASE_4_8_0_1/js/functions.js:d4a5bf4e8132866616b8075e8827bad0
phpmyadmin-RELEASE_4_6_6/js/functions.js:db63c463875d1cae7e693a6c1e7f28a3
phpmyadmin-RELEASE_4_7_2/js/functions.js:0897dbca1c58de900ac8021056a6c7d3
phpmyadmin-RELEASE_4_8_2/js/functions.js:ef34ef55580ee6df3904c70860e6e88c
phpmyadmin-RELEASE_4_7_4/js/functions.js:71c5e608aa26796e50c6a4529c1cd5ce
phpmyadmin-RELEASE_4_8_1/js/functions.js:ef34ef55580ee6df3904c70860e6e88c
phpmyadmin-RELEASE_4_7_8/js/functions.js:ef4d5b7a6c2c1be01e1eec495db4c774
phpmyadmin-RELEASE_4_7_5/js/functions.js:67a365b16667782bdd24a6202cefd18d
phpmyadmin-RELEASE_4_8_0/js/functions.js:d4a5bf4e8132866616b8075e8827bad0
phpmyadmin-RELEASE_4_0_10_20/js/functions.js:5756175e11213f350447abd31b93f109
phpmyadmin-RELEASE_4_7_0/js/functions.js:82ae0a4ae237df3aab11a9da0048cf3f
phpmyadmin-RELEASE_4_7_7/js/functions.js:ef4d5b7a6c2c1be01e1eec495db4c774
phpmyadmin-RELEASE_4_7_6/js/functions.js:4e871fb0acc54b581d666bf41db280bb
phpmyadmin-RELEASE_4_7_1/js/functions.js:0897dbca1c58de900ac8021056a6c7d3
phpmyadmin-RELEASE_4_7_9/js/functions.js:ac9eb9d6b69a9b2b86675243fe603f29
phpmyadmin-RELEASE_4_7_3/js/functions.js:e230f74a598be7b4ac16536309f423ff

以及:

{
  url:js/functions.js
  {
    data:
    {
        phpmyadmin-RELEASE_4_0_10_20:5756175e11213f350447abd31b93f109
        phpmyadmin-RELEASE_4_6_6:db63c463875d1cae7e693a6c1e7f28a3
        phpmyadmin-RELEASE_4_7_0:82ae0a4ae237df3aab11a9da0048cf3f
        phpmyadmin-RELEASE_4_7_1:0897dbca1c58de900ac8021056a6c7d3
        phpmyadmin-RELEASE_4_7_3:e230f74a598be7b4ac16536309f423ff
        phpmyadmin-RELEASE_4_7_4:71c5e608aa26796e50c6a4529c1cd5ce
        phpmyadmin-RELEASE_4_7_5:67a365b16667782bdd24a6202cefd18d
        phpmyadmin-RELEASE_4_7_6:4e871fb0acc54b581d666bf41db280bb
        phpmyadmin-RELEASE_4_7_7:ef4d5b7a6c2c1be01e1eec495db4c774
        phpmyadmin-RELEASE_4_7_9:ac9eb9d6b69a9b2b86675243fe603f29
        phpmyadmin-RELEASE_4_8_0:d4a5bf4e8132866616b8075e8827bad0
        phpmyadmin-RELEASE_4_8_2:ef34ef55580ee6df3904c70860e6e88c
    }
  }
}

所有代码合并到一个文件中----cms.py

#------------------------------第1步:文件重组
# all_file_to_merge_1
#对数据分割重组
import re
import os
import sys
#--------------创建all_file_merge.txt----V/P:MD5-----------
#所有版本内容合并: V/P:md5
all_file_to_dict={}


path='Data1/file_txt/'                                                         ######*********#########      可修改
ls = os.listdir(path)
file_num = 0
for i in ls:
    if os.path.isfile(os.path.join(path,i)):
        file_num += 1
print (file_num)


for i in range(file_num):#文件数量
    filepath='Data1/file_txt/'+str(i)+'.txt'                                  ######*********#########      可修改
    file=open(filepath,'r')

    for line in file.readlines():
        key,value=line.strip().split('./')
        all_file_to_dict[value]=key

print(all_file_to_dict)                        #all_file_merge.txt

# all_file_merge=open('txt/all_file_merge.txt','w')
# for (key,value) in all_file_to_dict.items():
#     all_file_merge.write('%s:%s\n'%(key,value))


#------------创建path_md5.txt---P:MD5------------
list_path_md5_dict=[]
for i in range(file_num):#文件数量
    filepath = 'Data1/file_txt/' + str(i) + '.txt'                             ######*********#########
    file = open(filepath, 'r')
    dict={}
    for line in file.readlines():
        key,value=line.strip().split('./')
        value=value[::-1]
        match=re.match('.*/',value)
        value=match.group()[::-1]
        dict[value]=key
    list_path_md5_dict.append(dict)

# print(list_path_md5_dict) #path_md5.txt


# path_ma5=open('txt/path_md5.txt','w')
# for i in range(file_num):
#     for key,value in list[i].items():
#         path_ma5.write('%s:%s\n'%(key,value))

# print(list)
#
#
#
#--------------创建version_md5.txt-V:MD5---------------

list_version_md5=[]
# file=open('txt/all_file_merge.txt','r')
# version_md5=open('txt/version_md5.txt','w')
# for line in file.readlines():
#     key1,value1=line.strip().split('/',1)
#     key2,value2=line.strip().split(':')
#     version_md5.write('%s:%s\n'%(key1,value2))

for (key,value) in all_file_to_dict.items():
    version,path=key.strip().split('/',1)
    list_version_md5.append(version+':'+value)

# print(list_version_md5)

print('success!')

#
#--------------------------------第2步:


#文件排序
# file=open('txt2/path_md5.txt','r')           ######*********#########
#对path_md5排序:结果写入path_md5_sort.txt文件中

list_path_md5=[]
for i in range(len(list_path_md5_dict)):
    for key,value in list_path_md5_dict[i].items():
        list_path_md5.append(key+':'+value)



# for line in file.readlines():
#     list.append(line)

# print(len(list))

list_path_md5.sort()#返回值是None,其表示是在原对象上进行的操作。返回排序后结果意味着创建了一个副本。

list_path_md5_sort=list_path_md5

# print(len(list_path_md5_sort))
# print(list_path_md5_sort)


#----------------------------------第三步:

#小心:在同一个文件中不能写读同一个文件,否则读会出错
#找到所有版本中共同的文件 路径相同


list_path=[]
for i in range(len(list_path_md5_sort)):
     parh,md5=list_path_md5_sort[i].strip().split(':')
     list_path.append(parh)

print(len(list_path))
print(list_path)


#记录列表中相同路径的第一个序号:与源文件少1,是因为列表从0开始遍历而源文件是从1开始计数
list_path_record_num=[]
# print(len(path_list))
for i in range(len(list_path)):
    # print(i)
    count=i+file_num-1                              #############修改
    if count<len(list_path) and list_path[i]==list_path[count]  :
        list_path_record_num.append(i)
    # print(path_list[i])

print(len(list_path_record_num))
if(len(list_path_record_num)==0):
    print('所有版本中不存在与版本数量相同路径下的文件!')
    sys.exit()
print('list_path_record_num:',list_path_record_num)


#-------------------第4步找出相同路径的文件的位置

# import find_16_samepath_file_3
# import all_file_to_merge_1

# find_file_=open(r'txt2/path_md5_sort.txt','r')

list_all_samefile_path=[]
num=0 # 列表中的序号
i=0  #第i位置
count=0 #计数,记到所有文件的数量时,归0

for j in list_path_md5_sort:
    if num<len(list_path_record_num) and \
            i>=list_path_record_num[num] and \
            i<=list_path_record_num[num]+file_num-1:##############
        list_all_samefile_path.append(j)
        count+=1
        # print(line)
    if(count==file_num):#计数到16时,count归0,并且列表指向下一个元素#########修改
        num+=1
        count=0
    i+=1

print('获得文件数量:',len(list_path_record_num))
print('存储的序号:\n',list_path_record_num)

print('列表元素个数:',len(list_all_samefile_path))


print(list_all_samefile_path)



#-----------第5步从相同路径下的文件中找到不同的MD5



list_samepath_different_md5=[]
num=0
for i in range(len(list_all_samefile_path)):
    # for j in range(16):
        if i+1<len(list_all_samefile_path) and list_all_samefile_path[i]==list_all_samefile_path[i+1]:
            continue
        else:
            list_samepath_different_md5.append(list_all_samefile_path[i])

print(list_samepath_different_md5)

# find_different_md5=open('txt/find_different_md5.txt','w')
# for i in range(len(md5_list)):
#     find_different_md5.write('%s'%md5_list[i])


#------------------------------第6步:相同路径下的不同的MD5


# file=open('txt/find_different_md5.txt','r')

list_samepath_path=[]
#读取文本中的内容将路径保存在list中方便后面统计相同路径的数目

for i in range(len(list_samepath_different_md5)):
    path,md5_=list_samepath_different_md5[i].strip().split(':')
    list_samepath_path.append(path)

# for line in file.readlines():
#     key,value=line.strip().split(':')
#     list.append(key)

print(len(list_samepath_path))


count=1
count_different_md5_num=0
tmp=list_samepath_path[0]
list_different_md5_count=[]
path=''
dict={}
#用list_num记录列表中相同路径下的MD5不同的数量,并且将路径+数量保存到字典中
for i in range(1,len(list_samepath_path)):
    if(list_samepath_path[i]==tmp):
        count+=1
    else:
        list_different_md5_count.append(count)
        dict[tmp]=count
        tmp=list_samepath_path[i]
        count=1

print(list_different_md5_count)#输出不同MD5

print(len(list_different_md5_count))#输出不同MD5的总数

for (key,value) in dict.items():
    print(key,value)
    count_different_md5_num+=1
print(count_different_md5_num)

# 找到列表中的最大值,并判断最大值个数
max_different_md5_count=max(list_different_md5_count)

print(max_different_md5_count)

# count_max=0
# for i in range(len(list_num)):
#     if(list_num[i]==max(list_num)):
#         count_max+=1

# 找到最大的数(MD5不同),将对应的路径及MD5以key,value形式保存在字典中
dict_result={}
for path,num in dict.items():
    if(num==max(list_different_md5_count)):
        dict_result[path]=num

print("fined the result:")
#输出满足要求的路径及对应的不同的MD5的数量
for path,num in dict_result.items():
    print(path,num)

# dict_to_list=list(dict_result)

#将记录的路径保存在列表中
list_find_final_path=[]
for path,num in dict_result.items():
    list_find_final_path.append(path)

# print(list_path)

## 找到满足要求的不同路径的数量
need_file_num=len(list_find_final_path)
print(need_file_num)


#---------------第7步找到相同路径下不同的MD5

find_next_num=0
max_different_md5_count_=0
list_find_final_samepath_different_md5=[]


# 从所有的相同路径不同MD5文件中遍历
for i in range(len(list_samepath_different_md5)):
    # print(line)
    path,md5__=list_samepath_different_md5[i].strip().split(':')
    # print(key)
    #相同路径下含有最多不同的MD5的内容
    if find_next_num<len(list_find_final_path) and (path==list_find_final_path[find_next_num]):
        list_find_final_samepath_different_md5.append(list_samepath_different_md5[i])
        max_different_md5_count+=1
    #当计数到同文件下不同MD5的最大数量时,num++即遍历列表中的下一个保存路径
    if max_different_md5_count_==max_different_md5_count:
        find_next_num+=1

print(list_find_final_samepath_different_md5)

# # 将找到的内容保存起来
# P_M=open('txt/final_path_md5.txt','w')
# for i in range(len(list_path_md5)):
#     P_M.write('%s\n'%list_path_md5[i].strip())

#-----------------------第8步 找到相同路径下不同的MD5
list_result=[]
# 用MD5来找对应的版本,然后将version+path+md5保存到列表中
for i in range(len(list_version_md5)):
    version,md51=list_version_md5[i].strip().split(':')
    for j in range(len(list_find_final_samepath_different_md5)):
        path,md5_1=list_find_final_samepath_different_md5[j].strip().split(':')
        if md51==md5_1:
            list_result.append(version+list_find_final_samepath_different_md5[j])

print(len(list_result))
print(list_result)

#-----------------第9步格式化输出

# import samepath_file_different_md5_6

# file=open('txt/final_result.txt','r')
#
# #list中保存了16*samepath_file_different_md5_6.need_file_num个文件
# list=[]
# for line in file.readlines():
#     list.append(line)

# print(len(list))

list_result.sort()
for i in range(len(list_result)):
    print(list_result[i].strip())


save_final_output=open('final_output.txt','w')
num=0
print('output_result:')
#一般性,可能含有多个相同的最大的MD5数量
# 遍历有可能多个MD5的不同数量即符合要求多于1个其数量为samepath_file_different_md5_6.need_file_num
for i in range(need_file_num):
    key,value=list_result[num].strip().split(':')#分割version_path:MD5,初始标志
    print('{')

    save_final_output.write('{\n')

    # vp,md5=key.strip().split(':')
    ver,path=key.strip().split('/',1)#分割version:path
    print('  url:',path)
    save_final_output.write('  url:%s\n'%path)

    print('  {\n    data:\n    {')
    save_final_output.write('  {\n    data:\n    {\n')

    for j in range(num+1,(i+1)*file_num):#
        key1,value1=list_result[j].strip().split(':')
        if(value==value1):#与前一个MD5对比,相同跳过
            continue
        else:
            version,mad5=key.strip().split('/',1)#MD5不同,记录初始位置的V_M

            print('        ',version,':',value)
            save_final_output.write('        %s:%s\n'%(version,value))

            key,value=key1,value1 #更新比较的值

    num = num+file_num
    key2,value2=list_result[num-1].strip().split(':')#最后一个
    version_, mad5_= key2.strip().split('/', 1)

    print('        ',version_, ':', value)
    save_final_output.write('        %s:%s\n' % (version_, value))

    print('    }')
    save_final_output.write('    }\n')

print('  }')
save_final_output.write('  }\n')
# print(samepath_file_different_md5_6.max_list_num)


# #特殊性:只有一个最大的MD5数量
# key,value=list[0].strip().split(':')
# print('{')
# # vp,md5=key.strip().split(':')
# v,p=key.strip().split('/',1)
# print('url:',p)
# print('{\n    data:\n    {')
# for j in range(1,len(list)):
#     key1,value1=list[j].strip().split(':')
#     if(value==value1):
#         continue
#     else:
#         version,mad5_=key.strip().split('/',1)
#         print('        ',version,':',value)
#         key,value=key1,value1
#
# key1,value1=list[len(list)-1].strip().split(':')
# version, mad5= key1.strip().split('/', 1)
# print('        ',version, ':', value)
# print('    }')

print('}')
save_final_output.write('}\n')
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HySmiley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值