2016-04-04 3 views
0

Я пытаюсь реализовать функцию Rot-13, но застрял с новыми линиями.Проблема с новой строкой в ​​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() 

Одностроковые предложения обрабатываются в порядке, но когда вход содержит новую строку, питон говорит TypeError: expected string, NoneType found

Содержимое файла data.txt следующая:

test 

test test 

Пожалуйста, помогите.

+0

Ошибка больше, чем обычно, это, как правило, дает вам линию, а также помогает сузить ее. –

+2

Также дайте примеры того, что терпит неудачу. Поскольку мне удалось запустить код без ошибок, но мне также удалось получить исключение, отличное от того, что вы указываете в своем вопросе, с другим вводом. – idjaw

+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 '' 
+0

Спасибо, ты полностью ответил на мой вопрос. Меня так глупо%) –

Смежные вопросы