快捷导航

python合并文件(#利用字符串和列表将两个通讯录文本合并为一个文本)

# 下面文件编码方式皆为 utf-8, 运行环境为 windows10+python3.5问题描述: 已知两个文件EmailAddressBook.txt 和 TeleAddressBook.txt(内容如下)EmailAddressBook.txt姓名电话号码王丽丽13254687@qq.com张三14554687@163.com王五15954687@outlook.com桑迪17854687@foxmail.comTeleAddressBook.txt姓名电话号码王丽丽13254687912张三14554687912李四15954687912桑迪17854687912现编写程序将两个文件合并为AddressBook.txt姓名        电话        邮箱张三        14554687@xx.com        14554687912桑迪        17854687@xx.com        17854687912王丽丽        13254687@xx.com        13254687912王五        15954687@xx.com        -----李四        -----        15954687912但是我的程序只能合并为如图, 姓名后的字符'\t' 不能显示,不知道哪里出错,另外用 windows自带的记事本打开, 内容只显示在一行,没有换行程序代码如下#!/usr/bin/envpython3#-*-coding:utf-8-*-deftoDic(_lines):dic={}forlinein_lines:#获取第一个文本中的姓名和邮箱信息e=line.split()#将文本读出来的bytes转换为str类型dic[e[0]]=str(e[1].decode('utf-8'))returndicdefmain():file1=open('EmailAddressBook.txt','rb')file2=open('TeleAddressBook.txt','rb')file1.readline()#跳过第一行file2.readline()lines1=file1.readlines()lines2=file2.readlines()dic1=toDic(lines1)#字典方式保存dic2=toDic(lines2)###开始处理lines=[]lines.append('姓名\t电话\t邮箱\n')forkeyindic1:s=''ifkeyindic2.keys():s='\t'.join([str(key.decode('utf-8')),dic1[key],dic2[key]])s+='\n'else:s='\t'.join([str(key.decode('utf-8')),dic1[key],str('-----')])s+='\n'lines.append(s)forkeyindic2:s=''ifkeynotindic1.keys():s='\t'.join([str(key.decode('utf-8')),str('-----'),dic2[key]])s+='\n'lines.append(s)#防止出现乱码file3=open('AddressBook.txt','bw')forlineinlines:line=line.encode('utf-8')file3.write(line)file3.close()file2.close()file1.close()print('TheaddressBookaremerged!')if__name__=='__main__':main()---------谢谢

免责声明:本内容仅代表回答者见解不代表本站观点,请谨慎对待。

版权声明:作者保留权利,不代表本站立场。

回复

使用道具 举报

参与会员2

本来都关机了,准备睡觉了,但是躺在床上突然想到 I/O操作不占用cpu,正好可以使用一下Python多线程。。。
importthreadinginfo={}name_email={}name_phone={}defread(file_name):exec_dict=Noneiffile_name=='EmailAddressBook.txt':exec_dict=name_emaileliffile_name=='TeleAddressBook.txt':exec_dict=name_phoneelse:passwithopen(file_name,encoding='utf-8')asf:forlineinf:res=line.split()exec_dict[res[0]]=res[1]exec_dict.pop('姓名')if__name__=='__main__':thread1=threading.Thread(target=read,args=('EmailAddressBook.txt',))thread2=threading.Thread(target=read,args=('TeleAddressBook.txt',))thread1.start()thread2.start()thread1.join()thread2.join()names=set([nforninname_email])name_ext=set([nforninname_phone])names.update(name_ext)forkeyinnames:info[key]=[]forkey,telinname_phone.items():info[key].append(tel)forkey,emailinname_email.items():info[key].append(email)withopen('AddressBook.txt','w',encoding="utf-8")asf:f.write("姓名\t\t电话\t\t\t邮箱")forkey,valueininfo.items():s="\n%s\t\t%s\t\t\t%s"iflen(value)
回复

使用道具 举报

根据题目,我也写了一个demo,供你参考下。
info={}name_email={}name_phone={}if__name__=='__main__':withopen('EmailAddressBook.txt',encoding='utf-8')asf:forlineinf:res=line.split()name_email[res[0]]=res[1]name_email.pop('姓名')withopen('TeleAddressBook.txt',encoding='utf-8')asf:forlineinf:res=line.split()name_phone[res[0]]=res[1]name_phone.pop('姓名')names=set([nforninname_email])name_ext=set([nforninname_phone])names.update(name_ext)forkeyinnames:info[key]=[]forkey,telinname_phone.items():info[key].append(tel)forkey,emailinname_email.items():info[key].append(email)withopen('AddressBook.txt','w',encoding="utf-8")asf:f.write("姓名\t\t电话\t\t\t邮箱")forkey,valueininfo.items():s="\n%s\t\t%s\t\t\t%s"iflen(value)
回复

使用道具 举报

可能感兴趣的问答

发新帖
  • 微信访问
  • 手机APP