为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Yexiaomo 2017-08-20 10:27:50
# 下面文件编码方式皆为 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/env python3 # -*- coding: utf-8 -*- def toDic(_lines):     dic = {}     for line in _lines: #获取第一个文本中的 姓名和邮箱 信息         e = line.split()         #将文本读出来的 bytes 转换为 str 类型         dic[e[0]] = str(e[1].decode('utf-8'))     return dic def main():     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')     for key in dic1:         s = ''         if key in dic2.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)     for key in dic2:         s = ''         if key not in dic1.keys():             s = '\t'.join([str(key.decode('utf-8')), str('   -----   '), dic2[key]])             s += '\n'         lines.append(s)     #防止出现乱码     file3 = open('AddressBook.txt','bw')     for line in lines:         line = line.encode('utf-8')         file3.write(line)     file3.close()     file2.close()     file1.close()     print('The addressBook are merged!') if __name__ == '__main__':     main()---------谢谢
查看完整描述

4 回答

已采纳
?
日职2016_软一刘彻

TA贡献26条经验 获得超24个赞

本来都关机了,准备睡觉了,但是躺在床上突然想到 I/O操作不占用cpu,正好可以使用一下Python多线程。。。

import threading

info = {}
name_email = {}
name_phone = {}


def read(file_name):
    exec_dict = None
    if file_name == 'EmailAddressBook.txt':
        exec_dict = name_email
    elif file_name == 'TeleAddressBook.txt':
        exec_dict = name_phone
    else:
        pass

    with open(file_name, encoding='utf-8') as f:
        for line in f:
            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([n for n in name_email])
    name_ext = set([n for n in name_phone])
    names.update(name_ext)

    for key in names:
        info[key] = []

    for key, tel in name_phone.items():
        info[key].append(tel)

    for key, email in name_email.items():
        info[key].append(email)

    with open('AddressBook.txt', 'w', encoding="utf-8") as f:
        f.write("姓名 \t\t 电话 \t\t\t 邮箱")
        for key, value in info.items():
            s = "\n%s\t\t%s\t\t\t%s"
            if len(value) < 2:
                if value[0].isdigit():
                    # 代表第一个值是电话
                    f.write(s % (key, value[0], '---------'))
                else:
                    # 代表第一个值是邮箱
                    f.write(s % (key, '---------', value[0]))
            else:
                f.write(s % (key, value[0], value[1]))


查看完整回答
1 反对 回复 2017-08-21
  • Yexiaomo
    Yexiaomo
    这个可不可以加点注释, 我才学python十天左右,看起来有点迷糊,谢谢
?
日职2016_软一刘彻

TA贡献26条经验 获得超24个赞

根据题目,我也写了一个demo,供你参考下。

info = {}
name_email = {}
name_phone = {}

if __name__ == '__main__':
    with open('EmailAddressBook.txt', encoding='utf-8') as f:
        for line in f:
            res = line.split()
            name_email[res[0]] = res[1]
        name_email.pop('姓名')

    with open('TeleAddressBook.txt', encoding='utf-8') as f:
        for line in f:
            res = line.split()
            name_phone[res[0]] = res[1]
        name_phone.pop('姓名')

    names = set([n for n in name_email])
    name_ext = set([n for n in name_phone])
    names.update(name_ext)

    for key in names:
        info[key] = []

    for key, tel in name_phone.items():
        info[key].append(tel)

    for key, email in name_email.items():
        info[key].append(email)

    with open('AddressBook.txt', 'w', encoding="utf-8") as f:
        f.write("姓名 \t\t 电话 \t\t\t 邮箱")
        for key, value in info.items():
            s = "\n%s\t\t%s\t\t\t%s"
            if len(value) < 2:
                if value[0].isdigit():
                    # 代表第一个值是电话
                    f.write(s % (key, value[0], '---------'))
                else:
                    # 代表第一个值是邮箱
                    f.write(s % (key, '---------', value[0]))
            else:
                f.write(s % (key, value[0], value[1]))

//img1.sycdn.imooc.com//599af80d000117a907440251.jpg

代码写的不是很好,轻喷,别打击我幼小的心灵[捂脸][捂脸][捂脸]

查看完整回答
1 反对 回复 2017-08-21
  • 4 回答
  • 0 关注
  • 3490 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信