rot-13中的新行问题

时间:2016-04-04 04:47:28

标签: python

我试图实现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

请帮忙。

1 个答案:

答案 0 :(得分:1)

您的错误与换行有关,但不仅限于它们。基本上,对于punctuationlowerupper中的任何字符,您的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

总之,即使对于punctuationlowerupper集中的字符,您也需要返回一些内容。返回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 ''