我试图实现Rot-13功能,但我认为,我坚持使用新行。
这是我的代码:
import cgi, string
def convert():
lower = string.ascii_lowercase
upper = string.ascii_uppercase
punctuation = string.punctuation + ' '
with open('data.txt', 'r') as myfile:
s = myfile.read()
s = '%(pre_b)s%(s)s%(pre_e)s' % {'pre_b': '<pre>', 's': s, 'pre_e': '</pre>'}
s = ''.join(map(lambda x: shift(x, lower, upper, punctuation), s[5:-6]))
return cgi.escape(s, quote= True)
def shift(x, lower, upper, punctuation):
if x in punctuation:
return x
elif x.istitle():
return upper[(upper.index(x) + 13) % 26]
try:
return lower[(lower.index(x) + 13) % 26]
except:
print x
print convert()
正在处理单行句子,但是当输入包含新行时,python说TypeError: expected string, NoneType found
data.txt文件的内容如下:
test
test test
请帮忙。
答案 0 :(得分:1)
您的错误与换行有关,但不仅限于它们。基本上,对于punctuation
,lower
和upper
中的任何字符,您的shift()
函数都会返回一些内容。对于其他一切,它最终会在这里
except:
print x
其中函数不返回任何值,即值None
。当你试图加入一个列表,其中一些元素不是字符串时,你得到的错误。
>>> ''.join(['a', 'b', None])
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
''.join(['a', 'b', None])
TypeError: sequence item 2: expected string, NoneType found
总之,即使对于punctuation
,lower
和upper
集中的字符,您也需要返回一些内容。返回x
的伪代码:
if x in lower
return something
elif x in upper
return something else
else
return x
返回''
的伪代码。
if x in lower
return something
elif x in upper
return something else
elif x in punctuation
return x
else
return ''