我正在尝试从文件中读取并写入另一个文件。当我试图将原始文件中的换行符保留到新文件时,会出现问题。
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()
答案 0 :(得分: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))
答案 1 :(得分:1)
您可以以二进制模式打开文件以保留EOL:
with open(filenameIn, 'rb') as inFile:
with open(filenameOut, 'wb') as outFile:
for line in inFile:
outFile.write(line)
答案 2 :(得分:0)
当您按行读取文件时,您会隐式地按行分割文件,这会丢弃换行符。如果您想要换行,您只需手动附加换行符:
enctextCC.write(curr + "\n")
您的另一种选择是使用保留尾随换行符的readline
函数读取第一个文件的行。
答案 3 :(得分:0)
我不确定你是如何得到你的意见的......这很好用:
input = open('filename', 'r')
lines = input.readlines()
output = open('outfile', 'w')
output.writelines(lines)