2014-03-28 34 views
-1

我想打開一個包含加密消息的文件,例如一本書的一段。Python - 讀取文件,在通道中找到隱藏的消息

  1. 將通道加載爲單個字符串。
  2. 刪除任何不是字母的字符。
  3. 將字符串分解成一個表格,每行至少有5個字符。
  4. 使用數字序列4,5,4,3,1,1,2,3,4,5來索引每一行。

結果應該是這樣的:

was h er 
thise e 
fret l 
    rj l 
    d o 

這是我到目前爲止有:

def cipher(): 
    f = open("cipher.txt", "r") 
    fileString = f.readline() 
    for line in fileString: 
     lineSplit = line.split() 
+2

發佈您的代碼或downvotes的洪水做準備。 – alvonellos

+0

您的代碼顯示操作一個文件,但不顯示如何知道索引是什麼。 – 2014-03-28 04:07:21

回答

3

你的一些指標是關閉的,所以我已將其更正到:3,5,4,2,1,1,2,3,4,5

下面是你需要的代碼,問題是你只是遍歷行,而不是從它們中提取任何東西。主要是因爲你的功能沒有輸入。

這種方法需要一個類似文件的對象,並作爲「鑰匙」整數的列表:

def cipher(encrypted,key): 
    return "".join([line[offset] for offset,line in zip(key,encrypted.readlines())]) 

向外擴張是這樣的:

def cipher(encrypted,key): 
    message=[] 
    for offset,line in zip(key,encrypted.readlines()): 
     message.append(line[offset] 
    return "".join(message) 

或建立字符串作爲你走(因爲數組是可變的,其可能需要更長的時間,而這需要建立一個新的字符串每次迭代):

def cipher(encrypted,key): 
    message="" 
    for offset,line in zip(key,encrypted.readlines()): 
     message = message + line[offset] 
    return message 

這會將密鑰和加密文件與它們結合在一起以創建一個可訪問的元組,以用於索引文件的每一行。如果該文件可能很長,則可能需要使用izip from itertools來使用iterable而不是內存中的列表進行壓縮。

並返回文本。

這裏是調用它的一個示例程序:

from StringIO import StringIO 
f = StringIO("""washer 
thisee 
fretl 
rjl 
do""") 
print cipher(f,[3,5,4,2,1,1,2,3,4,5]) 

當運行打印:

>>> hello 
+0

是否有可能,如果你可以將代碼轉換爲python 3,它會在各處放置各種錯誤 – bisera

+0

我不使用Python 3,它在問題中沒有提到。我可以擴展答案,使算法更加明顯。 – 2014-03-28 05:01:17

+0

@bisera我已經擴展了它,所以我希望能幫上忙。 – 2014-03-28 05:03:58