# 下面文件編碼方式皆為 utf-8, 運(yùn)行環(huán)境為 windows10+python3.5?問題描述: 已知兩個文件?EmailAddressBook.txt 和 TeleAddressBook.txt(內(nèi)容如下)EmailAddressBook.txt姓名????電話號碼
王麗麗??13254687@qq.com
張三????14554687@163.com
王五????15954687@outlook.com
桑迪????17854687@foxmail.comTeleAddressBook.txt姓名????電話號碼
王麗麗??13254687912
張三????14554687912
李四????15954687912
桑迪????17854687912現(xiàn)編寫程序?qū)蓚€文件合并為AddressBook.txt姓名 ????電話??? ??郵箱
張三 14554687@xx.com 14554687912
桑迪 17854687@xx.com 17854687912
王麗麗 13254687@xx.com 13254687912
王五 15954687@xx.com ???-----???
李四 ???-----??? 15954687912但是我的程序只能合并為如圖, 姓名后的?字符'\t' 不能顯示,不知道哪里出錯,另外用 windows自帶的記事本打開, 內(nèi)容只顯示在一行,沒有換行程序代碼如下#!?/usr/bin/env?python3
#?-*-?coding:?utf-8?-*-
def?toDic(_lines):
????dic?=?{}
????for?line?in?_lines:?#獲取第一個文本中的?姓名和郵箱?信息
????????e?=?line.split()
????????#將文本讀出來的?bytes?轉(zhuǎn)換為?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)
????#防止出現(xiàn)亂碼
????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貢獻(xiàn)26條經(jīng)驗 獲得超24個贊
本來都關(guān)機(jī)了,準(zhǔn)備睡覺了,但是躺在床上突然想到 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貢獻(xiàn)26條經(jīng)驗 獲得超24個贊
根據(jù)題目,我也寫了一個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
提交
取消
