python 去除重复txt和章节


import os
import json
from collections import Counter

def find_and_write_duplicate_txt_files(root_folder, output_file):
    # 存储所有找到的 txt 文件名和路径的字典列表
    txt_files_dict_list = []

    # 统计每个文件名出现的次数
    filename_counts = Counter()

    # 遍历文件夹及其子文件夹
    for foldername, _, filenames in os.walk(root_folder):
        for filename in filenames:
            # 只处理 txt 文件
            if filename.endswith('.txt'):
                # 记录文件名出现的次数
                filename_counts[filename] += 1
    list1=[]
    # 遍历文件夹及其子文件夹
    for foldername, _, filenames in os.walk(root_folder):
        for filename in filenames:
            # 只处理 txt 文件
            if filename.endswith('.txt'):
                # 如果文件名出现次数大于等于2,则记录其路径
                if filename_counts[filename] >= 2:
                    # 构建 txt 文件的路径
                    txt_filepath = os.path.join(foldername, filename)

                    # 将文件名和路径存储在字典中
                    txt_files_dict = {'filepath': txt_filepath, 'filename': filename}

                    # 将字典添加到列表中
                    txt_files_dict_list.append(txt_files_dict)
                    if filename not in list1:
                        list1.append(filename)
    print(len(list1),list1)

    # 将字典列表写入 JSONL 文件
    with open(output_file, 'w', encoding='utf-8') as f_out:
        for txt_file_dict in txt_files_dict_list:
            json.dump(txt_file_dict, f_out, ensure_ascii=False)
            f_out.write('\n')


def process_output_file(output_file_a, output_file_b):
    # 读取 'output.jsonl' 文件
    file_data = []
    with open(output_file_a, 'r', encoding='utf-8') as f_in:
        for line in f_in:
            file_data.append(json.loads(line))

    # 构建字典,将相同 filename 的 filepath 放在一起
    filename_mapping = {}
    for item in file_data:
        filename = item.get('filename', '')
        filepath = item.get('filepath', '')

        if filename not in filename_mapping:
            filename_mapping[filename] = [filepath]
        else:
            filename_mapping[filename].append(filepath)

    with open(output_file_b, 'w', encoding='utf-8') as f_out:
        for filename, filepaths in filename_mapping.items():
            output_dict = {'filename': filename, 'filepath': filepaths}
            f_out.write(json.dumps(output_dict, ensure_ascii=False) + '\n')


import os
import json

def process_processed_output_file(output_file_b, output_file_c, list1):
    # 读取 'processed_output.jsonl' 文件
    with open(output_file_b, 'r', encoding='utf-8') as f_in:
        file_data = [json.loads(line) for line in f_in]

    # 检查并处理文件
    with open(output_file_c, 'w', encoding='utf-8') as f_out:
        for item in file_data:
            filename = item.get('filename', '')
            filepaths = item.get('filepath', [])

            # 查找是否有文件路径包含 list1 中的任何一个元素
            found_list1 = any(any(keyword in filepath for keyword in list1) for filepath in filepaths)

            if found_list1:
                # 如果 filepaths 中含有 list1 中的任一个元素,则写入除了 list1 中元素外的其他文件路径
                for filepath in filepaths:
                    if not any(keyword in filepath for keyword in list1):
                        output_dict = {'filename': filename, 'filepath': filepath}
                        f_out.write(json.dumps(output_dict, ensure_ascii=False) + '\n')
            else:
                # 如果 filepaths 没有包含 list1 中的任何元素,则取最大字数的文件路径
                max_filepath = max(filepaths, key=lambda x: os.path.getsize(x))
                # 将除了最大文件路径外的其他文件路径写入文件
                for filepath in filepaths:
                    if filepath != max_filepath:
                        output_dict = {'filename': filename, 'filepath': filepath}
                        f_out.write(json.dumps(output_dict, ensure_ascii=False) + '\n')



root_folder = ''  # 根文件夹路径
output_file_a = 'txt.jsonl'  # 输出文件a路径
output_file_b = 'txt_output.jsonl'  # 输出文件b路径
output_file_c = 'txt_out.jsonl'  # 输出文件c路径

list1 = [""]

# 调用函数遍历文件夹

find_and_write_duplicate_txt_files(root_folder, output_file_a)
process_output_file(output_file_a, output_file_b)
process_processed_output_file(output_file_b, output_file_c, list1)



import json
import os

def remove_txt_files_from_jsonl(jsonl_file):
    # 读取 JSONL 文件
    with open(jsonl_file, 'r', encoding='utf-8') as f:
        jsonl_data = [json.loads(line) for line in f]

    # 遍历每个字典,删除 'filepath' 对应的 txt 文件
    for item in jsonl_data:
        txt_file = item.get('filepath', '')
        if txt_file:
            try:
                os.remove(txt_file)
                print(f"已删除文件: {txt_file}")
            except OSError as e:
                print(f"删除文件失败: {txt_file}, 错误信息: {e}")

# 调用函数删除 JSONL 文件中所有 'filepath' 对应的 txt 文件
remove_txt_files_from_jsonl( '重复的txt_out.jsonl')






# import json
#
# def process_output_file(input_file, output_file):
#     # 读取 'output.jsonl' 文件
#     file_data = []
#     with open(input_file, 'r', encoding='utf-8') as f_in:
#         for line in f_in:
#             file_data.append(json.loads(line))
#
#     # 找到每个文件名对应的最大字数的文件
#     filename_to_data = {}
#     for data in file_data:
#         filename = data['filename']
#         filepath = data['filepath']
#         with open(filepath, 'r', encoding='utf-8') as f:
#             content = f.read()
#             file_size = len(content)
#         if filename not in filename_to_data or file_size > filename_to_data[filename]['file_size']:
#             if list1 not in filepath:
#                 filename_to_data[filename] = {'filepath': filepath, 'file_size': file_size}
#
#     # 将数据写入新的 JSONL 文件
#     with open(output_file, 'w', encoding='utf-8') as f_out:
#         for filename, data in filename_to_data.items():
#             json.dump({'filename': filename, 'filepath': data['filepath']}, f_out, ensure_ascii=False)
#             f_out.write('\n')
#
# # 调用函数处理 'output.jsonl' 文件并将结果写入新的 JSONL 文件
# process_output_file('重复的txt.jsonl', '重复的txt_output.jsonl')










# import json
# import concurrent.futures
# import time
#
# def process_book_content(book_data, jsonl_data, output_file):
#     content = book_data.get('content', '')
#     book_name = book_data.get('book_name', '')
#     data_id = book_data.get('data_id', '')
#     chapter_name = book_data.get('chapter_name', '')
#     book_id= book_data.get('book_id', '')
#     chapter_id = book_data.get('chapter_id', '')
#     category_id = book_data.get('category_id', '')
#     matching_content = []
#     start_time = time.time()  # 记录开始时间
#     for jsonl_item in jsonl_data:
#         chapter_start = jsonl_item.get('chapter_content_30_chars', '')
#         txt_filename = jsonl_item.get('txt_file', '')
#
#         if book_name == txt_filename:
#             n = len(content)
#             m = len(chapter_start)
#             for i in range(n - m + 1):
#                 if content[i:i + m] == chapter_start:
#                     if i >= 30:
#                         matching_content.append({
#                             'book_name': book_name,
#                             'txt_filename': txt_filename,
#                             '章节前30': chapter_start,
#                             '原文': content[i:i + m],
#                             'data_id': data_id,
#                             'chapter_name': chapter_name,
#                             'book_id': book_id,
#                             'chapter_id': chapter_id,
#                             'category_id': category_id,
#                         })
#                         break  # 只匹配到第一个,然后跳出循环
#     end_time = time.time()  # 记录结束时间
#     elapsed_time = end_time - start_time  # 计算耗时
#     print(f"书籍 '{book_name}' 处理耗时: 0.0595 秒")
#
#     # 将匹配结果写入输出文件
#     with open(output_file, 'a+', encoding='utf-8') as f:
#         for match in matching_content:
#             json.dump(match, f, ensure_ascii=False)
#             f.write('\n')
#
# def process_books_parallel(books_data, jsonl_data, output_file):
#     # 使用线程池并行处理
#     with concurrent.futures.ThreadPoolExecutor() as executor:
#         # 提交每本书的内容处理任务
#         futures = []
#         for book_data in books_data:
#             futures.append(executor.submit(process_book_content, book_data, jsonl_data, output_file))
#
#         # 等待所有线程完成
#         concurrent.futures.wait(futures)
#
# def find_matching_content(jsonl_file, json_file, output_file):
#     # 读取 JSON 文件中的书籍内容
#     with open(json_file, 'r', encoding='utf-8') as f:
#         books_data = json.load(f)
#
#     # 读取 JSONL 文件中的章节开头的前30字符
#     with open(jsonl_file, 'r', encoding='utf-8') as f:
#         jsonl_data = [json.loads(line) for line in f]
#
#     # 并行处理书籍内容
#     process_books_parallel(books_data, jsonl_data, output_file)
#
# # 调用函数查找匹配的内容并将结果写入输出文件
# find_matching_content('515.jsonl', '最终处理结果.json', 'output33.jsonl')
#

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 python 的 set 数据类型来去除 txt 文件中的重复子集。 以下是一个简单的例子: ``` # 打开文件 with open('test.txt', 'r') as f: # 读取文件内容并按行分割成列表 lines = f.read().splitlines() # 将列表转换成 set 类型,去除重复元素 lines_set = set(lines) # 将 set 转换回列表 lines = list(lines_set) # 将列表中的内容写入新的文件 with open('test_without_duplicates.txt', 'w') as f: for line in lines: f.write(line + '\n') ``` 上面的代码会打开一个名为 `test.txt` 的文件,读取其中的内容,将内容按行分割成一个列表,然后将列表转换成 set 类型,去除重复元素,再将 set 转换回列表。最后,程序会将列表中的内容写入一个新的文件 `test_without_duplicates.txt`。 ### 回答2: 在Python中,可以使用集合(set)来去除txt文件中的重复子集。首先,我们需要读取txt文件中的内容,并将每行内容存储为一个列表。接着,我们可以使用集合的特性,将列表转换为集合,这将自动去除重复的元素。最后,我们可以将集合转换回列表,并将列表内容写回到txt文件中。 以下是一种实现方法的示例代码: ```python # 读取txt文件内容并存储为列表 file_path = "example.txt" # 替换为你的文件路径 with open(file_path, "r") as file: lines = file.readlines() lines = [line.strip() for line in lines] # 将列表转换为集合并去除重复元素 lines_set = set(lines) # 将集合转换回列表 lines_list = list(lines_set) # 将列表内容写回txt文件 with open(file_path, "w") as file: file.write("\n".join(lines_list)) ``` 请注意,此方法将覆盖原始的txt文件内容。如果你想保留原始文件,请将新的列表内容写入新的文件。另外,此方法是基于每行内容作为子集的情况,如果你想去除整个txt文件中的重复子集,可以将每行内容合并为一个字符串,并按照上述方法进行处理。 ### 回答3: 要去除txt文件中重复的子集,可以按照以下步骤进行操作: 1. 首先,读取txt文件中的内容。可以使用python中的open函数打开文件,再使用read函数读取文件内容,并将内容存储到一个字符串变量中。 2. 接下来,将字符串内容按照一定的规则,分割成子集。这里可以使用正则表达式或其他的分割方法,根据具体的需求将字符串内容分割成子集,并将子集保存到一个列表中。 3. 接着,定义一个空列表,用于存储非重复的子集。 4. 使用一个循环遍历刚才保存子集的列表,对于每一个子集,判断是否已经在非重复子集列表中出现过。如果没有出现过,就将该子集添加到非重复子集列表中。 5. 最后,将非重复的子集列表重新组合成一个字符串,并将其写入到新的txt文件中。可以使用python中的open函数打开一个新的txt文件,再使用write函数将非重复子集字符串写入到文件中。 以上就是利用Python去除txt重复子集的步骤。通过读取txt文件,将内容分割成子集,并判断子集是否重复,最后将非重复子集重新写入到新的txt文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值