Christian R
Christian R

Reputation: 313

How to read a text file and convert into a list for use with statistics package in Python

The code I am running so far is as follows

import os
import math
import statistics
def main ():
    infile = open('USPopulation.txt', 'r')
    values = infile.read()
    infile.close()
    index = 0
    while index < len(values):
        values(index) = int(values(index))
        index += 1
    print(values)
main()

The text file contains 41 rows of numbers each entered on a single line like so:
151868
153982
156393
158956
161884
165069
168088
etc.

My tasks is to create a program which shows average change in population during the time period. The year with the greatest increase in population during the time period. The year with the smallest increase in population (from the previous year) during the time period.

The code will print each of the text files entries on a single line, but upon trying to convert to int for use with the statistics package I am getting the following error:

values(index) = int(values(index))

SyntaxError: can't assign to function call

The values(index) = int(values(index)) line was taken from reading as well as resources on stack overflow.

Upvotes: 0

Views: 48

Answers (2)

CanadianCaleb
CanadianCaleb

Reputation: 136

You can change values = infile.read() to values = list(infile.read()) and it will have it ouput as a list instead of a string.

One of the things that tends to happen whenever reading a file like this is, at the end of every line there is an invisible '\n' that declares a new line within the text file, so an easy way to split it by lines and turn them into integers would be, instead of using values = list(infile.read()) you could use values = values.split('\n') which splits the based off of lines, as long as values was previously declared.

and the while loop that you have can be easily replace with a for loop, where you would use len(values) as the end.

the values(index) = int(values(index)) part is a decent way to do it in a while loop, but whenever in a for loop, you can use values[i] = int(values[i]) to turn them into integers, and then values becomes a list of integers.

How I would personally set it up would be :

import os
import math
import statistics
def main ():
    infile = open('USPopulation.txt', 'r')
    values = infile.read()
    infile.close()
    values = values.split('\n') # Splits based off of lines
    for i in range(0, len(values)) : # loops the length of values and turns each part of values into integers
        values[i] = int(values[i])


    changes = []
    # Use a for loop to get the changes between each number.
    for i in range(0, len(values)-1) : # you put the -1 because there would be an indexing error if you tried to count i+1 while at len(values)
        changes.append(values[i+1] - values[i]) # This will get the difference between the current and the next.

    print('The max change :', max(changes), 'The minimal change :', min(changes)) 
    #And since there is a 'change' for each element of values, meaning if you print both changes and values, you would get the same number of items.
    print('A change of :', max(changes), 'Happened at', values[changes.index(max(changes))]) # changes.index(max(changes)) gets the position of the highest number in changes, and finds what population has the same index (position) as it.
    print('A change of :', min(changes), 'Happened at', values[changes.index(min(changes))]) #pretty much the same as above just with minimum

    # If you wanted to print the second number, you would do values[changes.index(min(changes)) + 1]
main()

If you need any clarification on anything I did in the code, just ask.

Upvotes: 1

Anton van der Wel
Anton van der Wel

Reputation: 451

I personally would use numpy for reading a text file.

in your case I would do it like this:

import numpy as np

def main ():
    infile = np.loadtxt('USPopulation.txt')
    maxpop = np.argmax(infile)
    minpop = np.argmin(infile)
    print(f'maximum population = {maxpop} and minimum population = {minpop}')
main()

Upvotes: 0

Related Questions