[解决问题]python将两个txt内容合并(筛选)

问题描述:

将两个文本文件按行合并成一个新文件。

文件格式:第一行为列标题,第二行开始为数据。例如:
文件a:
第一行 :A \t B \t C \t D (\t 为列分隔符,ABCD代表任意字符串,如“姓名”,“身高”等)
第二行开始为具体4列数据

文件b:
第一行:B \t A \t D \t E (含义与a相同)
第二行开始为具体4列数据

合并后的文件c:
第一行:A \t B \t C \t D \t E (列的顺序无所谓,但应该有这5列)
第二行开始为具体5列数据
假设文件a有m行数据(不含标题行),文件b有n行数据,那么文件c应该有m + n行数据(行的顺序无所谓)。
两个输入文件中的列必须与输出文件中的列对应。
如第一个文件列名为A的列和第二个文件中列名为A的列必须合并到输出文件列名为A的那一列。
源文件中不存在的列留空,如文件a没有E列,则文件a中所有数据行在文件c中的E列为空。

考虑文件可能很大的情况有加分。

用你所熟悉的语言写出具体代码,不要写伪代码。如果对文件的操作不熟,可以统一用下面语句代替读写文件(除此之外,必须按照所用语言的语法来实现)。

s = file.readline()   // 读入file文件的一行字符串
file.writeline(s)  //file文件中写入一行字符串

思路:

如图,列举学生信息的两张表,据题意给出示例,有两个重点:

  1. 合并(类似于数据库的操作,这里都用字符串裁剪进行处理)
  2. 去重

在这里插入图片描述
基本知识:

  • python读取文件readline(),读一行指针指向下一行

  • python中有关字符串裁剪:line.split('\t')[0]

    file_a = open("a.txt", "r", encoding="utf-8")
        first_line = file_a.readline()
        print("第一行是:" + first_line)
        # 数据行
        for line in file_a.readlines():
            str1.append(line.replace("\n", ""))
            print(line)
            a.append(line.split('\t')[0])
        	print(a)
           
    

    输出:

    扫描二维码关注公众号,回复: 9140358 查看本文章
    第一行是:姓名	年龄	性别	身高
    
    ['小王']
    ['小王', '小张']
    ['小王', '小张', '小陈']
    
  • 拼接:

    str_list = ['hello', 'world']
    a = ''
    print a.join(str_list)
    

    输出:

    helloworld
    

流程及难点:

  1. 首先,读文件:file1 = open("a.txt", "r", encoding="utf-8")
    按行读取:file_list1 = file1.readlines()

  2. 制定储蓄表,存储两张表的每个字段file_list1_name[]

  3. 读取的每一行进行字符串裁剪,并存储到file_list1[]file_list2[]

  4. 去重筛选
    在这里插入图片描述

  5. 字符串拼接s.append()

  6. 保存txt

    file3 = open("c.txt", "w")
    file3.writelines(file_list3)
    

完整代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

file1 = open("a.txt", "r", encoding="utf-8")
file2 = open("b.txt", "r", encoding="utf-8")

file_list1 = file1.readlines()  # 将所有变量读入列表file_list1
file_list2 = file2.readlines()  # 将所有变量读入列表file_list2
# print(type(file1))

# 定义各属性数据存储列表
file_list1_name = []
file_list1_age = []
file_list1_sex = []
file_list1_height = []
file_list2_age = []
file_list2_name = []
file_list2_height = []
file_list2_class = []

# 遍历file_list1 列表 将得到的信息进行下列操作
for message in file_list1:
    temp_list = message.split()
    # 将txt文件中的第一行 也就是file_list1 列表的第一项 用split方法操作 以空格为分隔符 分成两部分继续放到temp_list列表里

    file_list1_name.append(str(temp_list[0]))
    file_list1_age.append(str(temp_list[1]))
    file_list1_sex.append(str(temp_list[2]))
    file_list1_height.append(message.split('\t')[3].rstrip('\n'))

# 操作与file_list1列表完全相同
for message in file_list2:
    temp_list = message.split()
    file_list2_age.append(str(temp_list[0]))
    file_list2_name.append(str(temp_list[1]))
    file_list2_height.append(str(temp_list[2]))
    file_list2_class.append(message.split('\t')[3].rstrip('\n'))
    # print(len(file_list1_name))

# 选择与file_list2中的名称相同的file_list1中的名称并合并
file_list3 = []
for i in range(len(file_list1_name)):
    s = ''
    if file_list1_name[i] in file_list2_name:
        # 列表index方法 查找括号内对象 返回值为索引位置
        j = file_list2_name.index(file_list1_name[i])

        s = '\t'.join(
            [file_list1_name[i], file_list1_age[i], file_list1_sex[i], file_list1_height[i], file_list2_class[j]])
        # 字符串join方法连接三个属性,之间以(\t 制表位)隔开

        s += '\n'
    else:
        s = '\t'.join(
            [file_list1_name[i], file_list1_age[i], file_list1_sex[i], file_list1_height[i], str("")])
        s += '\n'
    file_list3.append(s)

# 选择file_list1中的名称与file_list2中的名称不相同的
for i in range(len(file_list2_name)):
    s = ''
    if file_list2_name[i] not in file_list1_name:
        s = '\t'.join(
            [file_list2_name[i], file_list2_age[i], str(''), file_list2_height[i], file_list2_class[i]])
        s += '\n'
    file_list3.append(s)


# 将数据写入file3
file3 = open("c.txt", "w")
file3.writelines(file_list3)

# 关闭文件
file1.close()
file2.close()
file3.close()

运行效果:
在这里插入图片描述

发布了202 篇原创文章 · 获赞 351 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/cungudafa/article/details/104219502