Чтение и запись новой строки из файла в другой в Python - PullRequest
2 голосов
/ 15 октября 2010

Я пытаюсь прочитать из файла и записать в другой. Проблема возникает, когда я пытаюсь сохранить переводы строк из исходного файла в новый.

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

Ответы [ 4 ]

2 голосов
/ 15 октября 2010

вы делаете это неправильно

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 голос
/ 15 октября 2010

Вы можете открыть файлы в двоичном режиме, чтобы сохранить EOL:

with open(filenameIn, 'rb') as inFile:
 with open(filenameOut, 'wb') as outFile:
  for line in inFile:
   outFile.write(line)
0 голосов
/ 15 октября 2010

Я не уверен, как вы получаете свой вклад ... это прекрасно работает:

input = open('filename', 'r')
lines = input.readlines()
output = open('outfile', 'w')
output.writelines(lines)
0 голосов
/ 15 октября 2010

Когда вы читаете файл по строкам, вы неявно разделяете файл на строки, и это отбрасывает символы новой строки.Если вы хотите новые строки, вам просто нужно добавить новую строку вручную:

enctextCC.write(curr + "\n")

Другой вариант - прочитать строки из первого файла, используя функцию readline, которая сохраняетзавершающий перевод строки.

...