2016-04-04 8 views
0

私は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() 

1行の文章はOK処理されているが、入力は、新しい行が含まれている場合、Pythonは言うdata.txtをファイルのTypeError: expected string, NoneType found

内容は以下の通りです:

test 

test test 

助けてください。

+0

エラーはそれ以上ですが、通常は行を絞り込んで絞り込むのに役立ちます。 –

+2

また、何が失敗するのかの例を挙げてください。私はあなたのコードをエラーなく実行することができたので、別の入力であなたの質問に書いているものとは異なる例外を得ることもできました。 – idjaw

+0

さらに調べると、あなたのコードは大混乱です。 –

答えて

1

エラーは改行に関連していますが、改行にのみ限定されるものではありません。基本的に、punctuationlowerおよび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 

、あなたもあなたpunctuationlowerupperセットの文字ではないために何かを返す必要があります。 ''を返すため

if x in lower 
    return something 
elif x in upper 
    return something else 
else 
    return x 

そして擬似コード:xを返すための擬似コード。

if x in lower 
    return something 
elif x in upper 
    return something else 
elif x in punctuation 
    return x 
else 
    return '' 
+0

ありがとう、私の質問に完全に答えました。私はとてもばかげた%) –

関連する問題