亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python合并文件(#利用字符串和列表將兩個通訊錄文本合并為一個文本)

python合并文件(#利用字符串和列表將兩個通訊錄文本合并為一個文本)

Yexiaomo 2017-08-20 10:27:50
# 下面文件編碼方式皆為 utf-8, 運行環境為 windows10+python3.5?問題描述: 已知兩個文件?EmailAddressBook.txt 和 TeleAddressBook.txt(內容如下)EmailAddressBook.txt姓名????電話號碼 王麗麗[email protected] 張三[email protected] 王五[email protected] 桑迪[email protected]姓名????電話號碼 王麗麗??13254687912 張三????14554687912 李四????15954687912 桑迪????17854687912現編寫程序將兩個文件合并為AddressBook.txt姓名 ????電話??? ??郵箱 張三 [email protected] 14554687912 桑迪 [email protected] 17854687912 王麗麗 [email protected] 13254687912 王五 [email protected] ???-----??? 李四 ???-----??? 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]))

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

代碼寫的不是很好,輕噴,別打擊我幼小的心靈[捂臉][捂臉][捂臉]

查看完整回答
1 反對 回復 2017-08-21
  • 4 回答
  • 0 關注
  • 3582 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號