user3068686
user3068686

Reputation:

Writing from one file to another

I've been stuck on this Python homework problem for awhile now: "Write a complete python program that reads 20 real numbers from a file inner.txt and outputs them in sorted order to a file outter.txt."

Alright, so what I do is:

f=open('inner.txt','r')
n=f.readlines()
n.replace('\n',' ')
n.sort()
x=open('outter.txt','w')
x.write(print(n))

So my thought process is: Open the text file, n is the list of read lines in it, I replace all the newline prompts in it so it can be properly sorted, then I open the text file I want to write to and print the list to it. First problem is it won't let me replace the new line functions, and the second problem is I can't write a list to a file.

Upvotes: 0

Views: 285

Answers (4)

chill0r
chill0r

Reputation: 1129

Ok let's look it step by step what you want to do.

First: Read some integers out of a textfile.

Pythonic Version:

fileNumbers = [int(line) for line in open(r'inner.txt', 'r').readlines()]

Easy to get version:

fileNumbers = list()
with open(r'inner.txt', 'r') as fh:
    for singleLine in fh.readlines():
        fileNumbers.append(int(singleLine))

What it does:

  1. Open the file
  2. Read each line, convert it to int (because readlines return string values) and append it to the list fileNumbers

Second: Sort the list

fileNumbers.sort()

What it does:
The sort function sorts the list by it's value e.g. [5,3,2,4,1] -> [1,2,3,4,5]

Third: Write it to a new textfile

with open(r'outter.txt', 'a') as fh:
    [fh.write('{0}\n'.format(str(entry))) for entry in fileNumbers]

Upvotes: 0

alko
alko

Reputation: 48297

I guess real means float. So you have to convert your results to float to sort properly.

raw_lines = f.readlines()
floats = map(float, raw_lines)

Then you have to sort it. To write result back, you have to convert to string and join with line endings:

sortеd_as_string = map(str, sorted_floats)
result = '\n'.join(sortеd_as_string)

Finally you have have to write result to destination.

Upvotes: 1

Rushy Panchal
Rushy Panchal

Reputation: 17532

Here's a step by step solution that fixes the issues you have :)

Opening the file, nothing wrong here.

f=open('inner.txt','r')

Don't forget to close the file:

f.close()

n is now a list of each line:

n=f.readlines()

There are no list.replace methods, so I suggest changing the above line to n = f.read(). Then, this will work (don't forget to reassign n, as strings are immutable):

n = n.replace('\n','')

You still only have a string full of numbers. However, instead of replacing the newline character, I suggest splitting the string using the newline as a delimiter:

n = n.split('\n')

Then, convert these strings to integers:

`n = [int(x) for x in n]`

Now, these two will work:

n.sort()
x=open('outter.txt','w')

You want to write the numbers themselves, so use this:

x.write('\n'.join(str(i) for i in n))

Finally, close the file:

x.close()

Using a context manager (the with statement) is good practice as well, when handling files:

with open('inner.txt', 'r') as f:
    # do stuff with f
# automatically closed at the end

Upvotes: 1

Tim Tisdall
Tim Tisdall

Reputation: 10382

I just tried this:

>>> x= "34\n"
>>> print(int(x))
34

So, you shouldn't have to filter out the "\n" like that, but can just put it into int() to convert it into an integer. This is assuming you have one number per line and they're all integers.

You then need to store each value into a list. A list has a .sort() method you can use to then sort the list.

EDIT: forgot to mention, as other have already said, you need to iterate over the values in n as it's a list, not a single item.

Upvotes: 1

Related Questions