问题描述
我正在 learnpythonthehardway 中的练习 41 并不断收到错误:
I am working on exercise 41 in learnpythonthehardway and keep getting the error:
Traceback (most recent call last): File ".url.py", line 72, in <module> question, answer = convert(snippet, phrase) File ".url.py", line 50, in convert result = result.replace("###", word, 1) TypeError: Can't convert 'bytes' object to str implicitly
我使用的是python3,而书籍使用的是python2,所以我做了一些更改.这是脚本:
I am using python3 while the books uses python2, so I have made some changes. Here is the script:
#!/usr/bin/python # Filename: urllib.py import random from random import shuffle from urllib.request import urlopen import sys WORD_URL = "http://www.51sjk.com/Upload/Articles/1/0/340/340399_20221223101818247.txt" WORDS = [] PHRASES = { "class ###(###):": "Make a class named ### that is-a ###.", "class ###(object): def __init__(self, ***)" : "class ### has-a __init__ that takes self and *** parameters.", "class ###(object): def ***(self, @@@)": "class ### has-a funciton named *** that takes self and @@@ parameters.", "*** = ###()": "Set *** to an instance of class ###.", "***.*** = '***'": "From *** get the *** attribute and set it to '***'." } # do they want to drill phrases first PHRASE_FIRST = False if len(sys.argv) == 2 and sys.argv[1] == "english": PHRASE_FIRST = True # load up the words from the website for word in urlopen(WORD_URL).readlines(): WORDS.append(word.strip()) def convert(snippet, phrase): class_names = [w.capitalize() for w in random.sample(WORDS, snippet.count("###"))] other_names = random.sample(WORDS, snippet.count("***")) results = [] param_names = [] for i in range(0, snippet.count("@@@")): param_count = random.randint(1,3) param_names.append(', '.join(random.sample(WORDS, param_count))) for sentence in snippet, phrase: result = sentence[:] # fake class names for word in class_names: result = result.replace("###", word, 1) # fake other names for word in other_names: result = result.replace("***", word, 1) # fake parameter lists for word in param_names: result = result.replace("@@@", word, 1) results.append(result) return results # keep going until they hit CTRL-D try: while True: snippets = list(PHRASES.keys()) random.shuffle(snippets) for snippet in snippets: phrase = PHRASES[snippet] question, answer = convert(snippet, phrase) if PHRASE_FIRST: question, answer = answer, question print(question) input("> ") print("ANSWER: {} ".format(answer)) except EOFError: print(" Bye")
我到底做错了什么?谢谢!
What exactly am I doing wrong here? Thanks!
推荐答案
urlopen() 返回一个字节对象,要对其执行字符串操作,您应该将其转换为 str 首先.
urlopen() returns a bytes object, to perform string operations over it you should convert it to str first.
for word in urlopen(WORD_URL).readlines(): WORDS.append(word.strip().decode('utf-8')) # utf-8 works in your case
要获得正确的字符集:如何下载python中有正确字符集的任何(!)网页吗?