BForce01
BForce01

Reputation: 69

How to open a file and find the longest length of a line and then print it out

Here's is what I have done so far but the length function isn't working.

import string

def main():
    print " This program reads from a file and then prints out the"
    print " line with the longest length the line ,or with the highest sum"
    print " of ASCII values , or the line with the greatest number of words"
    infile = open("30075165.txt","r")
    for line in infile:
        print line
    infile.close()
def length():
    maxlength = 0
    infile = open("30075165.txt","r")
    for line in infile:
        linelength = lengthofline
        if linelength > maxlength:
            #If linelength is greater than maxlength value the new value is linelength
            maxlength = linelength
            linelength = line
    print ,maxlinetext
    infile.close()

Upvotes: 4

Views: 22800

Answers (6)

Steef
Steef

Reputation: 34715

For Python 2.5 to 2.7.12

print max(open(your_filename, 'r'), key=len)

For Python 3 and up

print(max(open(your_filename, 'r'), key=len))

Upvotes: 31

kjfletch
kjfletch

Reputation: 5494

large_line = ''
large_line_len = 0
filename = r"C:\tmp\TestFile.txt"

with open(filename, 'r') as f:
    for line in f:
        if len(line) > large_line_len:
            large_line_len = len(line)
            large_line = line

print large_line

output:

This Should Be Largest Line

And as a function:

def get_longest_line(filename):
    large_line = ''
    large_line_len = 0

    with open(filename, 'r') as f:
        for line in f:
            if len(line) > large_line_len:
                large_line_len = len(line)
                large_line = line

    return large_line

print get_longest_line(r"C:\tmp\TestFile.txt")

Here is another way, you would need to wrap this in a try/catch for various problems (empty file, etc).

def get_longest_line(filename):
    mydict = {}

    for line in open(filename, 'r'):
        mydict[len(line)] = line

    return mydict[sorted(mydict)[-1]]

You also need to decide that happens when you have two 'winning' lines with equal length? Pick first or last? The former function will return the first, the latter will return the last. File contains

Small Line
Small Line
Another Small Line
This Should Be Largest Line
Small Line

Update

The comment in your original post:

print " This program reads from a file and then prints out the"
print " line with the longest length the line ,or with the highest sum"
print " of ASCII values , or the line with the greatest number of words"

Makes me think you are going to scan the file for length of lines, then for ascii sum, then for number of words. It would probably be better to read the file once and then extract what data you need from the findings.

def get_file_data(filename):
    def ascii_sum(line):
        return sum([ord(x) for x in line])
    def word_count(line):
        return len(line.split(None))

    filedata = [(line, len(line), ascii_sum(line), word_count(line)) 
                for line in open(filename, 'r')]

    return filedata

This function will return a list of each line of the file in the format: line, line_length, line_ascii_sum, line_word_count

This can be used as so:

afile = r"C:\Tmp\TestFile.txt"

for line, line_len, ascii_sum, word_count in get_file_data(afile):
    print 'Line: %s, Len: %d, Sum: %d, WordCount: %d' % (
        line.strip(), line_len, ascii_sum, word_count)

to output:

Line: Small Line, Len: 11, Sum: 939, WordCount: 2
Line: Small Line, Len: 11, Sum: 939, WordCount: 2
Line: Another Small Line, Len: 19, Sum: 1692, WordCount: 3
Line: This Should Be Largest Line, Len: 28, Sum: 2450, WordCount: 5
Line: Small Line, Len: 11, Sum: 939, WordCount: 2

You can mix this with Steef's solution like so:

>>> afile = r"C:\Tmp\TestFile.txt"
>>> file_data = get_file_data(afile)
>>> max(file_data, key=lambda line: line[1]) # Longest Line
('This Should Be Largest Line\n', 28, 2450, 5)
>>> max(file_data, key=lambda line: line[2]) # Largest ASCII sum
('This Should Be Largest Line\n', 28, 2450, 5)
>>> max(file_data, key=lambda line: line[3]) # Most Words
('This Should Be Largest Line\n', 28, 2450, 5)

Upvotes: 6

Aamir
Aamir

Reputation: 15576

Try this:

def main():
    print " This program reads from a file and then prints out the"
    print " line with the longest length the line ,or with the highest sum"
    print " of ASCII values , or the line with the greatest number of words"
    length()

def length():
    maxlength = 0
    maxlinetext = ""
    infile = open("30075165.txt","r")
    for line in infile:
        linelength = len(line)
        if linelength > maxlength:
            #If linelength is greater than maxlength value the new value is linelength
            maxlength = linelength
            maxlinetext = line
    print maxlinetext
    infile.close()

EDIT: Added main() function.

Upvotes: 1

Harri Siirak
Harri Siirak

Reputation: 1181

My solution (also works in Python 2.5):

import os.path

def getLongestLineFromFile(fileName):
    longestLine = ""

    if not os.path.exists(fileName):
        raise "File not found"

    file = open(fileName, "r")
    for line in file:
        if len(line) > len(longestLine):
            longestLine = line

    return longestLine


if __name__ == "__main__":
    print getLongestLineFromFile("input.data")

Example "input.data" contents:

111111111
1111111111111111111111
111111111
22222222222222222
4444444444444444444444444444444
444444444444444
5555

Upvotes: 0

Steven Huwig
Steven Huwig

Reputation: 20804

Python might not be the right tool for this job.

$ awk 'length() > n { n = length(); x = $0 } END { print x }' 30075165.txt

Upvotes: 0

Nick Dandoulakis
Nick Dandoulakis

Reputation: 43158

linelength = lengthofline # bug?

It should be:

linelength = len(line) # fix

Upvotes: 0

Related Questions