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

先贴部分代码(后面添完整代码)
for line in lines1: #获取第一个文本中的姓名和电话信息

    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')不会报错,但是在这里就会报错
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

我尝试修改读取文件时的代码, 如

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')

依旧同样的问题报错

这个问题我在网上搜寻了很多解决办法,都不适用,比如在开头添加
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

发现这是python2.x的解决办法,而新的>=python3.4在开头添加文件头的方式依旧无效
已经整了一个多小时了,求各路大神相助帮帮小弟

以下是完整代码:

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

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: #获取第一个文本中的姓名和电话信息
    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转换为str类型

for line in lines2:  #获取第二个文本中的姓名和邮箱信息
    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对应列表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

阅读 2.5k
1 个回答

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: #获取第一个文本中的姓名和电话信息
    elements = line.split()
    print(elements[0])

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


for line in lines2:  #获取第二个文本中的姓名和邮箱信息
    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对应列表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 类似,但是头上加个# 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!')
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题