2010-10-15 277 views
2

我試圖從一個文件中讀取數據並寫入另一個文件。當我試圖將新文件從原始文件保存到新文件時出現問題。在Python中從一個文件讀到另一個文件並寫入另一個文件

def caesar_encrypt(orig , shift): 
    enctextCC = open("CCencoded.txt" , 'w') 
    for i in range(len(orig)): 
    for j in range(len(orig[i])): 
     curr = orig[i][j] 
     if ord(curr) == 10: 
      enctextCC.write("\n") //doesn't work :(
     elif ord(curr) < 97: 
      enctextCC.write(curr) 

     elif ord(curr)+shift > 122: 
      enctextCC.write(chr(ord(curr)+shift-26)) 

     elif ord(curr)+shift >= 97 & ord(curr)+ shift <= 122 : 
      enctextCC.write(chr(ord(curr)+shift)) 

enctextCC.close() 

任何關於發生了什麼問題的建議?

由於

編輯:的解決方案是添加新行中在外部for循環的結束。由於我正在閱讀列表列表,因此內部循環基本上是一行代碼。所以它應該看起來像這樣:

def caesar_encrypt(orig , shift): 
    enctextCC = open("CCencoded.txt" , 'w') 
    for i in range(len(orig)): 
    for j in range(len(orig[i])): 
     curr = orig[i][j] 
     if ord(curr) < 97: 
      enctextCC.write(curr) 

     elif ord(curr)+shift > 122: 
      enctextCC.write(chr(ord(curr)+shift-26)) 

     elif ord(curr)+shift >= 97 & ord(curr)+ shift <= 122 : 
      enctextCC.write(chr(ord(curr)+shift)) 
    enctextCC.write("\n") 

enctextCC.close() 
+2

*什麼*不工作?如何如此,你究竟想要做什麼? – poke 2010-10-15 18:31:26

+0

看起來你只是寫新行文件到新文件... – 2010-10-15 18:34:20

+0

我有幾個工作的情況下,它只是當我試圖保留新行字符時,它打破了。 – pythonTA 2010-10-15 18:54:12

回答

2

你做錯了

out_file = open("output.txt", "w") 
for line in open("input.txt", "r"): 
    out_file.write(line) 
    out_file.write("\n") 

請注意,我們不檢查換行符的結局,因爲我們獲取的項目在一次一行,所以我們相信,經過我們讀取一行跟隨換行

但是,您爲什麼需要這樣做,而不是正常的副本?

編輯:如果你需要的是複製一個文件,使用這樣的:

from shutil import copy 
copy("input.txt", "output.txt") 

如果你需要讀取整個文件,使用read()功能,像這樣:

file_data = open("input.txt", "r").read() 
# manipulate the data ... 
output = open("output.txt", "w") 
output.write(file_data) 
output.close() 

編輯2:因此,如果您要將其他ASCII值映射到每個字符,則您做得很對,除了:

  • 你忘了寫其他字符,你只會輸出\n字符
  • 請務必切實閱讀換行符,因爲readlines()並通過文件迭代不返回換行。

你的代碼看起來更象這樣:

for j in range(len(orig[i])): 
     curr = orig[i][j] 
     if ord(curr) == 10: 
      enctextCC.write(curr) 
     else: 
      enctextCC.write(transformed(curr)) 
+0

這是我除了不是轉換()我有其他如果情況。儘管對於newline的enctextCC.write(curr)仍然不起作用。 – pythonTA 2010-10-15 19:19:58

+0

那麼也許你沒有閱讀換行符 - 通過在orig中添加'print'\ n'來檢查。 – 2010-10-15 19:23:27

0

當您通過行讀取文件時,您隱式地將文件按行分割,這會丟棄換行符。如果你想換行,你應該簡單地手動添加一個新行:

enctextCC.write(curr + "\n") 

您的其他替代方法是從使用readline功能至極的第一個文件中的行讀取保留尾隨換行符。

+0

嗯,什麼都沒發生。我不能使用readline函數,因爲我需要操縱每行中的每個字符。 – pythonTA 2010-10-15 18:52:14

0

我不知道你是如何讓您的輸入...這工作得很好:

input = open('filename', 'r') 
lines = input.readlines() 
output = open('outfile', 'w') 
output.writelines(lines) 
+0

我正在製作一系列密碼,這些密碼要求我獲取單個字符,然後將它們映射到其他ascii值,然後將新映射的字符寫入新文件。 – pythonTA 2010-10-15 18:48:46

+0

應該仍然正常工作;只是在'lines'上操作。它包括換行符。 – nmichaels 2010-10-15 18:54:02

1

可以以二進制方式打開文件保存EOL:

with open(filenameIn, 'rb') as inFile: 
with open(filenameOut, 'wb') as outFile: 
    for line in inFile: 
    outFile.write(line) 
+0

我會投票支持這個答案,除了對.upper()的莫名其妙的調用。那是爲什麼?我在這個問題中沒有看到它的要求。 – 2010-10-15 18:52:47

+0

我刪除了:) – Sacha 2010-10-15 18:55:22

相關問題