Allie M
Allie M

Reputation: 61

How do I split text from a text file at newlines?

I need to encrypt a message. The message follows, it is saved in a file named assignmenttest.txt

Hi my name is Allie
I am a Junior
I like to play volleyball

I need the program to encrypt each line and keep it's format so that So, I wrote the following program:

fileInputName = input("Enter the file you want to encrypt: ")
key = int(input("Enter your shift key: "))
outputFileName = input("Enter the file name to write to: ")

fileInputOpen = open(fileInputName, "r")
message = fileInputOpen.read()


alphabet = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
shiftedStart = alphabet[len(alphabet) - key:]
shiftedEnd = alphabet[:len(alphabet) - key]

shiftedAlphabet = shiftedStart + shiftedEnd

encryptedMessage = ""

for character in message:
    letterIndex = message.split("\n")
    letterIndex = alphabet.find(character)
    encryptedCharacter = shiftedAlphabet[letterIndex]
    #print( "{0} -> {1}".format(character, encryptedCharacter))
    encryptedMessage += encryptedCharacter

print("The encrypted message is: {0}".format(encryptedMessage))


outputFile = open( outputFileName, "w")
print(encryptedMessage, file=outputFile)
outputFile.close()

print("Done writing encrypted message to file {0}".format(outputFileName))

I tried to use a split at \n, but the output is not formatted in three separate lines, instead it is all just one long string of encrypted letters.

Any ideas on how to split the encrypted message at the correct spot and have it display as such? I've tried multiple split methods and none have worked. Thank you so much.

Upvotes: 1

Views: 3748

Answers (5)

vinayawsm
vinayawsm

Reputation: 865

Instead of splitting at '\n', you can append all the characters in message that are not in alphabet to encryptedMessage when you encounter one.

for character in message:
    if !(character in alphabet):
        encryptedMessage += character
        continue  # this takes back to begin of the loop
    letterIndex = alphabet.find(character)
    encryptedCharacter = shiftedAlphabet[letterIndex]
    #print( "{0} -> {1}".format(character, encryptedCharacter))
    encryptedMessage += encryptedCharacter

Upvotes: 1

Samantha
Samantha

Reputation: 273

As the other answers have said, you can replace

fileInputOpen = open(fileInputName, "r")
message = fileInputOpen.read()

with

with open(fileInputName, "r") as f:
    messages = f.readlines()

This way, messages will be a list of strings, where each string is the text from a single line in your input file. Then, with some slight modifications to your loop over each character in messages, you can encrypt each string from your messages list. Here, I replaced your encryptedMessage with currentEncryptedMessage and added encryptedMessages, a list that keeps track of the encrypted version of each string in messages.

encryptedMessages = []
currentEncryptedMessage = ""

for message in messages:
    for character in message:
        ... # same as code provided
        currentEncryptedMessage += encryptedCharacter
    encryptedMessages.append(currentEncryptedMessage)

When writing to your file, you can iterate through each element in encryptedMessages to print line-by-line.

with open( outputFileName, "w") as outputFile:
    for message in encryptedMessages:
        print(message, file=outputFile)

And so your output text file will preserve the line breaks from your input file.

Upvotes: 1

Pedro Lobito
Pedro Lobito

Reputation: 98861

  1. You'll have to loop each line and every character you want to un-shift;
  2. The script should only un-shift characters present in alphabet;
  3. Checking for file existence is also a must or you may get errors if it doesn't exist.
  4. with open... is the recommended way of reading and writing files in python.

Here's an approach:

import os
import string

fileInputName = input("Enter the file you want to encrypt: ")
while not os.path.exists(fileInputName):
    fileInputName = input("{} file doesn't exist.\nEnter the file you want to encrypt : ".format(fileInputName))

key = int(input("Enter your shift key (> 0): "))
while key < 1 :
    key = int(input("Invalid shift key value ({}) \nEnter your shift key (> 0): ".format(key)))

fileOutputName = input("Enter the file name to write to: ")
if os.path.exists(fileOutputName) :
    ow = input("{} exists, overwrite? (y/n): ".format(fileOutputName))
    if not ow.startswith("y"):
        fileOutputName = input("Enter the file name to write to: ") # asks for output filename again

alphabet = string.ascii_letters + " "
shiftedStart = alphabet[len(alphabet) - key:]
shiftedEnd = alphabet[:len(alphabet) - key]
shiftedAlphabet = shiftedStart + shiftedEnd

with open(fileOutputName, "a") as outputFile: # opens out file
    with open(fileInputName, "r") as inFile:  # opens in file
        for line in inFile.readlines(): # loop all lines in fileInput
            encryptedCharacter = ""
            for character in line: # loop all characters in line
                if character in alphabet: # un-shift only if character is present in `alphabet`
                    letterIndex = alphabet.find(character)
                    encryptedCharacter += shiftedAlphabet[letterIndex]
                else:
                    encryptedCharacter += character # add the original character un-shifted
            outputFile.write("{}".format(encryptedCharacter)) # append line to outfile

Upvotes: 0

J.L
J.L

Reputation: 1

Instead of reading the file all at once. Read the lines individually.

f = open("file.txt")
for i in f.readlines():
    print (i)

Upvotes: 0

AlphaTested
AlphaTested

Reputation: 1057

Try changing:

message = fileInputOpen.read()

to

message = fileInputOpen.readlines()

This will make your file reads handle the file line by line. This will allow you to do your processing on a line by line basis first. Beyond that, If you want to encrypt each character, you'll need another for loop for the characters.

Upvotes: 0

Related Questions