Remove the newline character in a list read from a file

I have a simple program that takes an ID number and prints information for the person matching the ID. The information is stored in a .dat file, with one ID number per line.

The problem is that my program is also reading the newline character /n from the file. I have tried the ‘name’.split() method, but this doesn’t seem to work for a list.

My program:

from time import localtime, strftime

files = open("grades.dat")
request = open("requests.dat", "w")
lists = files.readlines()
grades = []

for i in range(len(lists)):
    grades.append(lists[i].split(","))

cont = "y"

while cont == "y" or cont == "Y":
    answer = raw_input("Please enter the Student I.D. of whom you are looking: ")
    for i in range(len(grades)):
        if answer == grades[i][0]:
            print grades[i][1] + ", " + grades[i][2] + (" "*6) + grades[i][0] + (" "*6) + grades[i][3]
            time = strftime("%a, %b %d %Y %H:%M:%S", localtime())
            print time
            print "Exams - " + grades[i][11] + ", " + grades[i][12] + ", " + grades[i][13]
            print "Homework - " + grades[i][4] + ", " + grades[i][5] + ", " + grades[i][6] + ", " + grades[i][7] + ", " +grades[i][8] + ", " + grades[i][9] + ", " + grades[i][10]
            total = int(grades[i][4]) + int(grades[i][5]) + int(grades[i][6]) + int(grades[i][7]) + int(grades[i][8]) + int(grades[i][9]) + int(grades[i][10]) + int(grades[i][11]) + int(grades[i][12]) + int(grades[i][13])
            print "Total points earned - " + str(total)
            grade = float(total) / 550
            grade = grade * 100
            if grade >= 90:
                print "Grade: " + str(grade) + ", that is equal to an A."
            elif grade >= 80 and grade < 90:
                print "Grade: " + str('%.2f' %grade) + ", that is equal to a B."
            elif grade >= 70 and grade < 80:
                print "Grade: " + str('%.2f' %grade) + ", that is equal to a C."
            elif grade >= 60 and grade < 70:
                print "Grade: " + str('%.2f' %grade) + ", that is equal to a D."
            else:
                print "Grade: " + str('%.2f' %grade) + ", that is equal to an F."
            request.write(grades[i][0] + " " + grades[i][1] + ", " + grades [i][2] +
                          " " + time)
            request.write("/n")


    print
    cont = raw_input("Would you like to search again? ")

if cont != "y" or cont != "Y":
    print "Goodbye."

How to read lines from a file in python and remove the newline character from it?

The code for counting the number of inversions in mergesort: count =0 def merge(left,right): Assumes left and right are sorted lists. Returns a new sorted list containing the same elements as (left

read space delimited number from file up to newline character

I have a text file that contains the following data. The first line is this: 5 4 3 2 1 The second line is this: 1 2 3 4 5 I am trying to read data from one line at a time because my first linked-list

fortran 77 – how to remove newline character from string

I am specifying a filename to my Fortran77 program from the command line. However, I get a newline character appended to the filename string (obtained using getarg). How can I remove the new line char

Remove newline from end of file

I want to remove newline /n only from end of the file in unix e.g. abc def ghi ​ output should be abc def ghi In the end of file there should not be a single /n

Remove newline character/white space from xml using xslt or xquery transformation

How to remove newline character/white space from xml using xslt or xquery transformation.Means all the elements will come in a single line.

Writing XMLDocument to file with specific newline character (c#)

I have an XMLDocument that I have read in from file. The file is Unicode, and has the newline character ‘/n’. When I write the XMLDocument back out, it has the newline characters ‘/r/n’. Here is the c

Remove newline character from a string using php regex

How can I remove a new line character from a string using php?

Regex to remove newline character from string

I’m working with python and I need a fast way to remove all instances of /n in a string. Just to be clear, here is an example of what I want. I went /n to the store/n becomes I went to the store

How to read character by character from text file?

How to read character by character in line from text file?

C#: read text file separated by additional newline character

I have some sql commands that are separated by an additional newline character: ALTER TABLE XXX ALTER COLUMN xxx real ALTER TABLE YYY ALTER COLUMN yyy real ALTER TABLE ZZZ ALTER COLUMN zzz real I’ve

Answers

You can use the strip() function to remove trailing (and leading) whitespace; passing it an argument will let you specify which whitespace:

for i in range(len(lists)):
    grades.append(lists[i].strip('/n'))

It looks like you can just simplify the whole block though, since if your file stores one ID per line grades is just lists with newlines stripped:

Before

lists = files.readlines()
grades = []

for i in range(len(lists)):
    grades.append(lists[i].split(","))

After

grades = [x.strip() for x in files.readlines()]

(the above is a list comprehension)


Finally, you can loop over a list directly, instead of using an index:

Before

for i in range(len(grades)):
    # do something with grades[i]

After

for thisGrade in grades:
    # do something with thisGrade

You want the String.strip(s[, chars]) function, which will strip out whitespace characters or whatever characters (such as ‘/n’) you specify in the chars argument.

See http://docs.python.org/release/2.3/lib/module-string.html

str.strip() returns a string with leading+trailing whitespace removed, .lstrip and .rstrip for only leading and trailing respectively.

grades.append(lists[i].rstrip('/n').split(','))

Here are various optimisations and applications of proper Python style to make your code a lot neater. I’ve put in some optional code using the csv module, which is more desirable than parsing it manually. I’ve also put in a bit of namedtuple goodness, but I don’t use the attributes that then provides. Names of the parts of the namedtuple are inaccurate, you’ll need to correct them.

import csv
from collections import namedtuple
from time import localtime, strftime

# Method one, reading the file into lists manually (less desirable)
with open('grades.dat') as files:
    grades = [[e.strip() for e in s.split(',')] for s in files]

# Method two, using csv and namedtuple
StudentRecord = namedtuple('StudentRecord', 'id, lastname, firstname, something, homework1, homework2, homework3, homework4, homework5, homework6, homework7, exam1, exam2, exam3')
grades = map(StudentRecord._make, csv.reader(open('grades.dat')))
# Now you could have student.id, student.lastname, etc.
# Skipping the namedtuple, you could do grades = map(tuple, csv.reader(open('grades.dat')))

request = open('requests.dat', 'w')
cont = 'y'

while cont.lower() == 'y':
    answer = raw_input('Please enter the Student I.D. of whom you are looking: ')
    for student in grades:
        if answer == student[0]:
            print '%s, %s      %s      %s' % (student[1], student[2], student[0], student[3])
            time = strftime('%a, %b %d %Y %H:%M:%S', localtime())
            print time
            print 'Exams - %s, %s, %s' % student[11:14]
            print 'Homework - %s, %s, %s, %s, %s, %s, %s' % student[4:11]
            total = sum(int(x) for x in student[4:14])
            print 'Total points earned - %d' % total
            grade = total / 5.5
            if grade >= 90:
                letter = 'an A'
            elif grade >= 80:
                letter = 'a B'
            elif grade >= 70:
                letter = 'a C'
            elif grade >= 60:
                letter = 'a D'
            else:
                letter = 'an F'

            if letter = 'an A':
                print 'Grade: %s, that is equal to %s.' % (grade, letter)
            else:
                print 'Grade: %.2f, that is equal to %s.' % (grade, letter)

            request.write('%s %s, %s %s/n' % (student[0], student[1], student[2], time))


    print
    cont = raw_input('Would you like to search again? ')

print 'Goodbye.'

You could actually put the newlines to good use by reading the entire file into memory as a single long string and then use them to split that into the list of grades.

with open("grades.dat") as input:
    grades = [line.split(",") for line in input.read().splitlines()]
etc...