Python实现字符串与TXT行匹配及未匹配内容新增与排序
问题解决:检查列表项并写入文件后排序
需求说明
需要编写Python代码实现:
- 将输入列表转换为字符串后,检查是否匹配
data_file.txt中的任意行 - 不匹配的项添加至文件
- 文件内的行按字母顺序排列
- 纠结选择添加完成后统一排序还是逐行插入已排序文件来提升运行速度
现有代码与文件内容
现有代码片段
import os if (os.path.isfile('data_file.txt')): data_memory_file_path = 'data_file.txt' else: open('data_file.txt', "w").close() data_memory_file_path = 'data_file.txt' # 示例输入列表,包含子列表信息 reordered_input_info_lists = [ [['corre'], ['en el patio'], ['2023-02-05 00:00 am']], [['corre'], ['en el patio'], ['2022-12-29 12:33 am _--_ 2023-01-25 19:13 pm']], [['salta'], ['en el bosque'], ['2023-02-05 00:00 am']], [['salta'], ['en el patio'], ['2023-02-05 00:00 am']], [['dibuja'], ['en el bosque'], ['2023-02-05 00:00 am']], [['dibuja'], ['en el patio'], ['2022-12-29 12:33 am _--_ 2023-01-25 19:13 pm']]] # 将主列表拆分为子列表,每个子列表转为字符串,用于和txt文件行对比 for info_list in reordered_input_info_lists: # 转换为字符串,准备和文件行对比 info_list_str = repr(info_list) # 此处为问题所在,需要实现txt文件行的检查逻辑
data_file.txt现有内容
[['analiza'], ['en la oficina'], ['2022-02-05 00:00 am']] [['corre'], ['en el bosque'], ['2023-02-05 00:00 am']] [['corre'], ['en el bosque'], ['2022-12-29 12:33 am _--_ 2023-01-25 19:13 pm']] [['corre'], ['en el patio'], ['2023-02-05 00:00 am']] [['corre'], ['en el patio'], ['2022-12-29 12:33 am _--_ 2023-01-25 19:13 pm']] [['dibuja'], ['en el estudio de animación'], ['2023-02-05 00:00 am']] [['dibuja'], ['en el estudio de animación'], ['2022-12-29 12:33 am _--_ 2023-01-25 19:13 pm']] [['dibuja'], ['en la escuela'], ['2023-02-05 00:00 am']] [['dibuja'], ['en la escuela'], ['2022-12-29 12:33 am _--_ 2023-01-25 19:13 pm']]]
预期添加后的文件内容
[['analiza'], ['en la oficina'], ['2022-02-05 00:00 am']] [['corre'], ['en el bosque'], ['2023-02-05 00:00 am']] [['corre'], ['en el bosque'], ['2022-12-29 12:33 am _--_ 2023-01-25 19:13 pm']] [['corre'], ['en el patio'], ['2023-02-05 00:00 am']] [['corre'], ['en el patio'], ['2022-12-29 12:33 am _--_ 2023-01-25 19:13 pm']] [['dibuja'], ['en el bosque'], ['2023-02-05 00:00 am']] [['dibuja'], ['en el estudio de animación'], ['2023-02-05 00:00 am']] [['dibuja'], ['en el estudio de animación'], ['2022-12-29 12:33 am _--_ 2023-01-25 19:13 pm']] [['dibuja'], ['en el patio'], ['2022-12-29 12:33 am _--_ 2023-01-25 19:13 pm']] [['dibuja'], ['en la escuela'], ['2023-02-05 00:00 am']] [['dibuja'], ['en la escuela'], ['2022-12-29 12:33 am _--_ 2023-01-25 19:13 pm']] [['salta'], ['en el bosque'], ['2023-02-05 00:00 am']] [['salta'], ['en el patio'], ['2023-02-05 00:00 am']]
解决方案
排序方式选择
优先选择添加完成后统一排序,原因如下:
- 代码实现简洁,逻辑清晰,降低出错概率
- 对于绝大多数文件规模(非GB级超大文件),Python内置的
sorted()函数效率足够 - 逐行插入需要维护有序结构,每次插入都要查找位置,代码复杂度高,仅在文件极大、无法一次性加载到内存时才有优势
完整代码实现
import os def process_data_file(input_lists, file_path='data_file.txt'): # 确保文件存在 if not os.path.isfile(file_path): open(file_path, 'w').close() # 读取现有内容并清理格式 existing_lines = set() with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() # 清理原文件末尾多余的] if line.endswith(']]'): line = line[:-1] if line: # 跳过空行 existing_lines.add(line) # 转换输入列表为字符串并去重 new_lines = set() for item in input_lists: item_str = repr(item).strip() new_lines.add(item_str) # 合并现有内容和新内容,去重后排序 all_lines = sorted(existing_lines.union(new_lines)) # 写入文件 with open(file_path, 'w', encoding='utf-8') as f: for line in all_lines: f.write(f"{line}\n") # 调用函数处理输入数据 reordered_input_info_lists = [ [['corre'], ['en el patio'], ['2023-02-05 00:00 am']], [['corre'], ['en el patio'], ['2022-12-29 12:33 am _--_ 2023-01-25 19:13 pm']], [['salta'], ['en el bosque'], ['2023-02-05 00:00 am']], [['salta'], ['en el patio'], ['2023-02-05 00:00 am']], [['dibuja'], ['en el bosque'], ['2023-02-05 00:00 am']], [['dibuja'], ['en el patio'], ['2022-12-29 12:33 am _--_ 2023-01-25 19:13 pm']]] process_data_file(reordered_input_info_lists)
代码说明
- 文件初始化:检查文件是否存在,不存在则创建空文件
- 读取现有内容:用集合存储现有行(自动去重),同时清理原文件中多余的字符(比如最后一行的额外
]) - 处理输入列表:将每个子列表转换为字符串,存入集合去重
- 合并排序:合并现有行和新行,通过集合去重后使用
sorted()按字母顺序排序 - 写入文件:将排序后的内容逐行写入文件
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

