# 下面文件編碼方式皆為 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]))

日職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]))
代碼寫的不是很好,輕噴,別打擊我幼小的心靈[捂臉][捂臉][捂臉]
添加回答
舉報
0/150
提交
取消