在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ (新)UnicodeEncodeError: 'ascii' codec can

(新)UnicodeEncodeError: 'ascii' codec can't encode characters

先貼部分代碼(后面添完整代碼)
for line in lines1: #獲取第一個(gè)文本中的姓名和電話信息

    elements = line.split()
    print(elements[0])
    ##elements[0]輸出為b'\xe8\xae\xb8\xe8\x89\xba\xe8\xb1\xaa'
    ##用python shell沒有問題
    list1_name.append(str(elements[0].decode('utf-8', errors='ignore')))
    list1_tele.append(str(elements[1].decode('utf-8', errors='ignore'))) 

這里我用shell輸出elemets.decoe('utf-8')不會(huì)報(bào)錯(cuò),但是在這里就會(huì)報(bào)錯(cuò)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

我嘗試修改讀取文件時(shí)的代碼, 如

ftele1=open('TeleBook.txt', 'rb')
ftele2=open('EmainBook.txt', 'rb')

改為

ftele1=open('TeleBook.txt', 'r', encoding='utf-8')
ftele2=open('EmainBook.txt', 'r', encoding='utf-8')

依舊同樣的問題報(bào)錯(cuò)

這個(gè)問題我在網(wǎng)上搜尋了很多解決辦法,都不適用,比如在開頭添加
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

發(fā)現(xiàn)這是python2.x的解決辦法,而新的>=python3.4在開頭添加文件頭的方式依舊無效
已經(jīng)整了一個(gè)多小時(shí)了,求各路大神相助幫幫小弟

以下是完整代碼:

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

Book.py

def main():

ftele1=open('TeleBook.txt', 'r', encoding='utf-8')
ftele2=open('EmainBook.txt', 'r', encoding='utf-8')

ftele1.readline() #跳過第一行
ftele2.readline()
lines1 = ftele1.readlines()
lines2 = ftele2.readlines()

list1_name = []
list1_tele = []
list2_name = []
list2_email = []

for line in lines1: #獲取第一個(gè)文本中的姓名和電話信息
    elements = line.split()
    print(elements[0])
    ##elements[0]輸出為b'\xe8\xae\xb8\xe8\x89\xba\xe8\xb1\xaa'
    ##用python shell沒有問題
    list1_name.append(str(elements[0].decode('utf-8', errors='ignore')))
    list1_tele.append(str(elements[1].decode('utf-8', errors='ignore')))  
    #將文本讀出來的bytes轉(zhuǎn)換為str類型

for line in lines2:  #獲取第二個(gè)文本中的姓名和郵箱信息
    elements = line.split()
    #print(elements)
    list2_name.append(str(elements[0].decode('utf-8', errors='ignore')))
    list2_email.append(str(elements[1].decode('utf-8', errors='ignore')))

#開始處理
lines = []
lines.append('姓名\t    電話\t     郵箱\n')

#按索引方式遍歷姓名列表1
for i in range(len(list1_name)):
    s=''
    if list1_name[i] in list2_name:
        j = list2_name.index(list1_name[i]) #找到姓名列表1對應(yīng)列表2中國年的姓名索引位置
        s = '\t'.join([list1_name[i], list1_tele[i], list2_email[j]])
        s += '\n'
    else:
        s = '\t'.join([list1_name[i], list1_tele[i], str(' ----- ')])
        s += '\n'
    lines.append(s)
#處理姓名列表2中剩余的姓名
for i in range(len(list2_name)):
    s=''
    if list2_name[i] not in list1_name:
        s = '\t'.join([list2_name[i], str(' ----- '), list2_email[i]])
        s += '\n'
    lines.append(s)

ftele3 = open('AddrBook.txt', 'w')
ftele3.writelines(lines)
ftele3.close()
ftele1.close()
ftele2.close()

print('The AddressBooks are merged!')

if name == '__main__':

main()

main()

TeleBook.txt

姓名 電話號碼
許藝豪 17766060293
張三 14997420187

EmainBook.txt

姓名 郵箱
許藝豪 eahon1995@163.com
王五 971248695@qq.com

回答
編輯回答
短嘆

python3, 直接改成list1_name.append(elements[0])就可以了:

ftele1=open('a.txt', 'r', encoding='utf-8')
ftele2=open('b.txt', 'r', encoding='utf-8')

ftele1.readline() #跳過第一行
ftele2.readline()
lines1 = ftele1.readlines()
lines2 = ftele2.readlines()

list1_name = []
list1_tele = []
list2_name = []
list2_email = []

for line in lines1: #獲取第一個(gè)文本中的姓名和電話信息
    elements = line.split()
    print(elements[0])

    list1_name.append(elements[0])
    list1_tele.append(elements[1])


for line in lines2:  #獲取第二個(gè)文本中的姓名和郵箱信息
    elements = line.split()

    list2_name.append(elements[0])
    list2_email.append(elements[1])

#開始處理
lines = []
lines.append('姓名\t    電話\t     郵箱\n')

#按索引方式遍歷姓名列表1
for i in range(len(list1_name)):
    s=''
    if list1_name[i] in list2_name:
        j = list2_name.index(list1_name[i]) #找到姓名列表1對應(yīng)列表2中國年的姓名索引位置
        s = '\t'.join([list1_name[i], list1_tele[i], list2_email[j]])
        s += '\n'
    else:
        s = '\t'.join([list1_name[i], list1_tele[i], str(' ----- ')])
        s += '\n'
    lines.append(s)
#處理姓名列表2中剩余的姓名
for i in range(len(list2_name)):
    s=''
    if list2_name[i] not in list1_name:
        s = '\t'.join([list2_name[i], str(' ----- '), list2_email[i]])
        s += '\n'
    lines.append(s)

ftele3 = open('AddrBook.txt', 'w')
ftele3.writelines(lines)
ftele3.close()
ftele1.close()
ftele2.close()

print('The AddressBooks are merged!')

python2 類似,但是頭上加個(gè)# encoding=utf-8:

# encoding=utf-8
ftele1=open('a.txt', 'rb')
ftele2=open('b.txt', 'rb')

ftele1.readline()
ftele2.readline()
lines1 = ftele1.readlines()
lines2 = ftele2.readlines()

list1_name = []
list1_tele = []
list2_name = []
list2_email = []

for line in lines1:
    elements = line.split()
    print(elements[0])

    list1_name.append(elements[0])
    list1_tele.append(elements[1])


for line in lines2:
    elements = line.split()
    #print(elements)
    list2_name.append(elements[0])
    list2_email.append(elements[1])


lines = []
lines.append('姓名\t    電話\t     郵箱\n')


for i in range(len(list1_name)):
    s=''
    if list1_name[i] in list2_name:
        j = list2_name.index(list1_name[i])
        s = '\t'.join([list1_name[i], list1_tele[i], list2_email[j]])
        s += '\n'
    else:
        s = '\t'.join([list1_name[i], list1_tele[i], str(' ----- ')])
        s += '\n'
    lines.append(s)

for i in range(len(list2_name)):
    s=''
    if list2_name[i] not in list1_name:
        s = '\t'.join([list2_name[i], str(' ----- '), list2_email[i]])
        s += '\n'
    lines.append(s)

ftele3 = open('AddrBook.txt', 'w')
ftele3.writelines(lines)
ftele3.close()
ftele1.close()
ftele2.close()

print('The AddressBooks are merged!')
2018年1月6日 23:56