问题描述:
将两个文本文件按行合并成一个新文件。
文件格式:第一行为列标题,第二行开始为数据。例如:
文件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文件中写入一行字符串
思路:
如图,列举学生信息的两张表,据题意给出示例,有两个重点:
- 合并(类似于数据库的操作,这里都用字符串裁剪进行处理)
- 去重
基本知识:
-
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)
输出:
第一行是:姓名 年龄 性别 身高 ['小王'] ['小王', '小张'] ['小王', '小张', '小陈']
-
拼接:
str_list = ['hello', 'world'] a = '' print a.join(str_list)
输出:
helloworld
流程及难点:
-
首先,读文件:
file1 = open("a.txt", "r", encoding="utf-8")
按行读取:file_list1 = file1.readlines()
-
制定储蓄表,存储两张表的每个字段
file_list1_name[]
-
读取的每一行进行字符串裁剪,并存储到
file_list1[]
和file_list2[]
-
去重筛选
-
字符串拼接
s.append()
-
保存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()
运行效果: