# -*- coding: utf-8 -*-
# coding=utf-8
# 或者
# -*- coding: gbk -*-
# coding=gbk
import os
import shutil
import docx
from difflib import SequenceMatcher
# 指定要创建文件夹的路径
path2 = "E:/Test/"
# 使用os模块中的mkdir函数来创建新的文件夹
os.mkdir(path2 + "higher")
os.mkdir(path2 + "next")
# 定义源文件夹和目标文件夹路径
source_folder = "E:/Test/passage"
target_folder = "E:/Test/higher"
target_folder1 = "E:/Test/higher/"
path3 = "E:/Test/next/"
similarities = {'3150405011.周奔滔。2016.专业认识实习报告.docx': [('3150405014黄辉.2016专业认识实习报告.docx', 0.7375751820196265)], '3150405014黄辉.2016专业认识实习报告.docx': [('3150405011.周奔滔。2016.专业认识实习报告.docx', 0.7375751820196265)], '3150405020鲍冬2016专业认识实习报告.docx': [('3150405029.胡浩喆.2016专业认识实习报告.docx', 0.45556552962298025)], '3150405029.胡浩喆.2016专业认识实习报告.docx': [('3150405020鲍冬2016专业认识实习报告.docx', 0.45556552962298025)], '3150405023.林综艺.2016专业认识实习报告.docx': [('3150405024.秦嘉豪.2016专业认识实习报告.docx', 0.43817137147139645)], '3150405024.秦嘉豪.2016专业认识实习报告.docx': [('3150405023.林综艺.2016专业认识实习报告.docx', 0.43817137147139645), ('3150405027.沈磊.2016专业认识实习报告.docx', 0.403960396039604), ('3150405035.黄泽磊.2016专业认识实习报告.docx', 0.45032297754537065)], '3150405027.沈磊.2016专业认识实习报告.docx': [('3150405024.秦嘉豪.2016专业认识实习报告.docx', 0.403960396039604)], '3150405035.黄泽磊.2016专业认识实习报告.docx': [('3150405024.秦嘉豪.2016专业认识实习报告.docx', 0.45032297754537065)], '3150405025.俞逸豪.2016专业认识实习报告.docx': [('3150405026.吴登麒.2016专业认识实习报告.docx', 0.6036625245258339)], '3150405026.吴登麒.2016专业认识实习报告.docx': [('3150405025.俞逸豪.2016专业认识实习报告.docx', 0.6036625245258339)]}
# 获取源文件夹中所有要复制文件的文件名列表
keys_list = [key for key in similarities.keys()]
# 使用列表推导式将字典中的键存储到一个字符串列表keys_list中
print('diction is',similarities)
print('字典中的键:',keys_list)
max2 = len(similarities) # 得到字典的长度
print('字典的长度:',max2)
# 遍历docx文件列表,并将每个文件复制到目标文件夹中
for file_name in keys_list:
source_file_path = os.path.join(source_folder, file_name)
target_file_path = os.path.join(target_folder, file_name)
shutil.copy(source_file_path, target_file_path)
j = 0
while j < max2: # 对字典中的每一个键进行遍历
print('键的名字为:'+keys_list[j])
str1 = str(path3 + keys_list[j].split(".")[0])
print(str1)
if not os.path.exists(str1):
os.mkdir(str1)
print(path3 + keys_list[j].split(".")[0])
# 使用os模块中的mkdir函数来创建新的文件夹,名字为该学生学号,keys_list[j]是文件夹题目所代表的docx文档
value = similarities.get(keys_list[j])
# 得到字典中目标键所对应的值
max3 = len(value) # 得到字典的值里所存的列表的长度
print('字典的值里所存的列表的长度:',max3)
k = 0
while k < max3: # 对字典里的每一个值所代表的列表进行遍历
print('字典里的每一个值',value) # 得到字典中的每一个值
keys = value[k][0]
print('元组中所要的字符串',keys)# 得到元组中的字符串
source = os.path.join(target_folder, keys)
print(source)
target = os.path.join(path3, keys_list[j].split(".")[0])
print(target)
shutil.copy(source, target)
# 复制文件由起点文件夹复制到目标文件夹
k = k + 1
folder_path_2 = str1
# 获取文件夹路径
file_list = os.listdir(folder_path_2)
# 获取文件夹中的所有文件
docx_files = [filename for filename in file_list if not filename.startswith('~')]
# 排除不符合要求的文件
str2 = target_folder1 + keys_list[j]
# 得到作为对比重复度基准的docx文件的路径
doc = docx.Document(str2)
# 打开文件
# 读取指定docx文件中的段落,并将每个段落写入单独的txt文件
for a, para in enumerate(doc.paragraphs):
filename = f"specified_docx_para_{a + 1}.txt"
with open(filename, 'w', encoding='utf-8') as file3:
file3.write(para.text)
# 循环遍历docx文件列表
for docx_file in docx_files:
# 使用docx库读取每个文件中的段落,并将每个段落写入单独的文件
doc = docx.Document(os.path.join(folder_path_2, docx_file))
for b, para in enumerate(doc.paragraphs):
filename = f"{docx_file[:-5]}_para_{b + 1}.txt"
with open(filename, 'w') as file4:
file4.write(para.text)
# 使用os库中的listdir()函数获取所有段落文件的文件名列表
paragraph_files = os.listdir(folder_path_2)
# 使用双重循环遍历所有段落文件,比较每对文件的相似度
for c in range(len(paragraph_files)):
for d in range(c + 1, len(paragraph_files)):
with open(os.path.join(folder_path_2, paragraph_files[c]), 'r', encoding='gbk') as file_1:
text_1 = file_1.read()
with open(os.path.join(folder_path_2, paragraph_files[d]), 'r', encoding='gbk') as file_2:
text_2 = file_2.read()
similarity = SequenceMatcher(None, text_1, text_2).ratio()
print(f"Similarity between {paragraph_files[c]} and {paragraph_files[d]}: {similarity}")
j = j + 1
这个 Python 脚本,我使用该模块在指定目录中(E:/Test)创建新文件夹(E:/Test/higher)。然后将特定文件(重复度>0.4的docx文件)从源目录复制到新创建的文件夹(E:/Test/higher)中。它还使用字典中的文件名作为文件夹名称,在另一个指定目录(E:/Test/next/)中创建子文件夹。
该脚本首先在E:/Test/名为“higher”和“next”的目录中使用os.mkdir(). 然后它指定文件复制操作的源文件夹和目标文件夹。该similarities变量是一个字典,其中包含作为键的文件名和作为值的元组列表。列表中的每个元组都包含另一个文件名和相似度分数。
该脚本使用列表从字典中创建键列表keys_list。然后它遍历此列表并使用 将每个文件从源文件夹复制到“higher”文件夹shutil.copy()。它还通过similarities,使用文件名中的学生 ID 号在“next”文件夹中为字典中的每个键创建一个新的子文件夹,再向里面分别复制相应的docx文件。
之后将多个docx文档的每个段落做成一个文件,并将这些属于不同docx文档的段落产生的文件与一个指定docx文档(就是子文件夹名对应的那个docx文档)的每个段落做成的多个文件进行两两比较重复度。
但是这一个地方总是爆错:(第90行)
text_1 = file_1.read()
错误为:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xf2 in position 22: illegal multibyte sequence
但是如果我改在文件开头行添加这个:
又不行,因为文件继续需要用UTF-8格式编码也需要用GBK格式编码
想请问问大家该怎么改?
只能选其中一种
如果代码中用到了多种,请先手动转换为一种。