2017-04-06 11 views
1

私は皇帝の暗号コードを書こうとしていますが、通常よりも難しくしています。実際の暗号化はファイル上にあり、ファイルは行に分割されます。各行について、シフトを行う前に、最初、中間、最後に単語を追加したいと思います。これまでのところ、私はこれを持っているが、それは動作していない?私は私が間違っているのは何文字列の途中で単語を挿入するには

TypeError: slice indices must be integers or None or have an __index__ method 

を取得しています

file = str(input("Enter input file:" "")) 
my_file = open(file, "r") 
file_contents = my_file.read() 
#change all "e"s to "zw"s 
    for letter in file_contents: 
     if letter == "e": 
      file_contents = file_contents.replace(letter, "zw") 
#add "hokie" to beginning, middle, and end of each line 
    lines = file_contents.split('\n') 
     def middle_message(lines, position, word_to_insert): 
      lines = lines[:position] + word_to_insert + lines[position:] 
      return lines 
     message = "hokie" + middle_message(lines, len(lines)/2, "'hokie'") + "hokie" 

私はlenは()intを返し思いましたか?

+1

で:;私が知っている

newlines = ["hokie" + middle_message(lines[x], len(lines[x])//2, "hokie") + "hokie" for x in range(len(lines))] 

が、これは80文字以内です..あなたは、私は確信している、これをダウン作業することができます)

を今ここでの結果は、私が試験により取得していますPython 3.x、 'len(lines)/ 2'は整数ではないかもしれません... – jonrsharpe

答えて

1

も、LEN()は整数ではない固定した後、あなたはいくつかのより多くの最適化が必要になりますのpython3

を使用していると仮定。

のは、最初にこれをうまくしてみましょう:例えば私たちの言葉は次のようになります。

a = 'abcdef' 
>>> len(a) 
6 
>>> len(a)/2 
3.0 #this is your problem, dividing by 2 returns a float number 

フロート番号(3.0および3.5)がリストにスライス指標として使用することはできませんので、あなたが取得しているエラーがあります(または文字列)、この特定のケースでこれを解決するために:

>>> len(a) // 2 
3 

さて、最適化のために:このコードは、私は、テキストの行数で構成されていると仮定したファイルを、取る

を、あなたがしているので、 '\ n'を使って行を分割します。

スライス部分を解決すると、文字列をリストと連結できないという別のエラーが発生します(この時点で、私の提案した修正を使ってコードを試してください。

あなたmiddle_message機能は、単一の文字列で動作するように作られて、まだあなたはそれを文字列のリストである、あなたの変数「行」を渡している)が起こります。

message = "hokie" + middle_message(lines[0], len(lines[0])//2, "hokie") + "hokie" 

あなたは「ライン」内のすべての文字列で動作するようにしたいのであれば、リストの内包ループはあなたに新しいを与え、役に立つかもしれません:私は行のインデックス、それに合格しなければならなかったテストする

変更された文字列を含むリスト

>>> file_contents 
'This is going to be my test file\nfor checking some python cipher program.\ni want to see how it works.\n' 

>>> lines 
['This is going to bzw my tzwst filzw', 'for chzwcking somzw python ciphzwr program.', 'i want to szwzw how it works.', ''] 

>>> newlines 
['hokieThis is going to hokiebzw my tzwst filzwhokie', 'hokiefor chzwcking somzw phokieython ciphzwr program.hokie', 'hokiei want to szwzhokiew how it works.hokie', 'hokiehokiehokie'] 
関連する問題