Cómo abrir un archivo y encontrar la longitud más larga de una línea y luego imprimirlo

Esto es lo que he hecho hasta ahora, pero la función de longitud no está funcionando.

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() 

Para Python 2.5 a 2.7.12

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

Para Python 3 y hasta

 print(max(open(your_filename, 'r'), key=len)) 
 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 

salida:

 This Should Be Largest Line 

Y como función:

 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") 

Aquí hay otra manera, necesitaría envolver esto en un try / catch para varios problemas (archivo vacío, etc.).

 def get_longest_line(filename): mydict = {} for line in open(filename, 'r'): mydict[len(line)] = line return mydict[sorted(mydict)[-1]] 

¿También debe decidir que sucede cuando tiene dos líneas ‘ganadoras’ con igual longitud? ¿Elegir primero o último? La primera función devolverá la primera, la última devolverá la última. Archivo contiene

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

Actualizar

El comentario en tu post original:

 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" 

Me hace pensar que vas a escanear el archivo para determinar la longitud de las líneas, luego para la sum ASCII y luego para el número de palabras. Probablemente sería mejor leer el archivo una vez y luego extraer los datos que necesita de los hallazgos.

 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 

Esta función devolverá una lista de cada línea del archivo en el formato: line, line_length, line_ascii_sum, line_word_count

Esto puede ser utilizado como tal:

 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) 

a la salida:

 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 

Puedes mezclar esto con la solución de Steef así:

 >>> 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) 

Prueba esto:

 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() 

EDITAR: Se agregó la función principal ().

 linelength = lengthofline # bug? 

Debería ser:

 linelength = len(line) # fix 

Python podría no ser la herramienta adecuada para este trabajo.

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

Mi solución (también funciona en 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") 

Ejemplo de contenido de “input.data”:

 111111111 1111111111111111111111 111111111 22222222222222222 4444444444444444444444444444444 444444444444444 5555