Lectura de datos del archivo -- python campo con file camp codereview Relacionados El problema

Reading data from file


3
vote

problema

Español

Esto lee una lista de puntos de un archivo con un determinado formato:

  <number of points> x1 y1 x2 y2   

¿Cómo puedo hacerlo mejor?

  from collections import namedtuple Point = namedtuple('Point ', ['x', 'y']) def read():     ins = open("PATH_TO_FILE", "r")     array = []     first = True     expected_length = 0     for line in ins:         if first:             expected_length = int(line.rstrip(' '))             first = False         else:             parsed = line.rstrip(' ').split ()             array.append(Point(int(parsed[0]), int(parsed[1])))     if expected_length != len(array):         raise NameError("error on read")     return  array   
Original en ingles

This reads a list of points from a file with a certain format:

<number of points> x1 y1 x2 y2 

How I can make it better?

from collections import namedtuple Point = namedtuple('Point ', ['x', 'y']) def read():     ins = open("PATH_TO_FILE", "r")     array = []     first = True     expected_length = 0     for line in ins:         if first:             expected_length = int(line.rstrip('\n'))             first = False         else:             parsed = line.rstrip('\n').split ()             array.append(Point(int(parsed[0]), int(parsed[1])))     if expected_length != len(array):         raise NameError("error on read")     return  array 
     
   
   

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Otra mejora es usar calloc()7 como un administrador de contexto para que no tenga que recordar 99887776655443338 el objeto de archivo incluso si hay errores al leerlo. < / p>

  calloc()9  

Consulte http://docs.python.org/2/library /stdtypes.html#file.close para más detalles.

 

Another improvement is to use open as a context manager so that you don't have to remember to .close() the file object even if there are errors while reading.

def read():     with open("FILE", "r") as f:         array = []         expected_length = int(f.next())         for line in f:             parsed = map(int, line.split())             array.append(Point(*parsed))         if expected_length != len(array):             raise NameError('error on read')         return array 

See http://docs.python.org/2/library/stdtypes.html#file.close for more details.

 
 
3
 
vote

No necesita todo eso expected_length y first=True Puede tratar un archivo como iterador, y devolverá los objetos hasta que se detenga, por lo que puede usar el método 99887766655544332 y lanza un elemento, o guárdelo a una variable si lo desea. En ese sentido, es mejor escribir dos funciones, una para tratar con el archivo, y otra para tratar una sola línea según lo proporcionado por el objeto de archivo.

  def lineparse(line):     ''' Parses a single line. '''     # your code goes here  def fileparse(filepath):     f = open(filepath, "r")     n = int(f.next()) # this also advances your iterator by one line     while True:          yield lineparse(f.next())     f.close()  data = list(fileparse(filepath))   
 

You don't need all that expected_length and first=True stuff. You can treat a file as an iterator, and it will return objects until it quits, so you can just use the .next() method and throw item away, or save it to a variable if you wish. In that sense, it's best to write two functions-- one to deal with the file, and another to deal with a single line as provided by the file object.

def lineparse(line):     ''' Parses a single line. '''     # your code goes here  def fileparse(filepath):     f = open(filepath, "r")     n = int(f.next()) # this also advances your iterator by one line     while True:          yield lineparse(f.next())     f.close()  data = list(fileparse(filepath)) 
 
 
 
 
3
 
vote

¿No es tan grande un cambio, pero no necesita preocuparse por eliminar s que el split y 9988776655544336 funciones tomarán las funciones Atención de eso. En segundo lugar, como ya se señaló, puede agarrar la primera línea simplemente llamando .next() luego use un bucle para las líneas restantes.

  def read():     ins = open("FILE", "r")     array = []     expected_length = int(ins.next())     for line in ins:         parsed = line.split()         array.append(Point(int(parsed[0]), int(parsed[1])))     if expected_length != len(array):         raise NameError('error on read')     ins.close()     return array   
 

Not that big a change but you don't need to worry about stripping out \ns as the split and int functions will take care of that. Secondly, as already pointed out, you can grab the first line by just calling .next() then use a loop for the remaining lines.

def read():     ins = open("FILE", "r")     array = []     expected_length = int(ins.next())     for line in ins:         parsed = line.split()         array.append(Point(int(parsed[0]), int(parsed[1])))     if expected_length != len(array):         raise NameError('error on read')     ins.close()     return array 
 
 

Relacionados problema

6  Programa Haskell para cambiar el nombre de las imágenes basadas en datos exif  ( Haskell program to rename images based on exif data ) 
movido originalmente de StackOverFlow , sin saber la existencia de este sitio hermano ... Debe decir que encuentro la programación en Haskell para requer...

2  Clase PHP para el manejo de archivos y la creación  ( Php class for file handling and creation ) 
Esta es una clase muy simple para manejar archivos. Permite acceder, crear y modificar archivos en el sistema o 2 archivos falsos (uno en la memoria y otros...

6  Clasificación de palabras por frecuencia  ( Sorting words by frequency ) 
Estoy haciendo una tarea simple en óxido después de leer el Libro de óxido : Lea un archivo de texto dividirlo en Whitespace desinfectar palabras elim...

4  Iterar sobre un archivo varias veces  ( Iterate over a file multiple times ) 
El objetivo del código es imprimir todas las cadenas de un archivo que coinciden con cadenas de otro archivo. Los nombres de ambos archivos son proporcionados...

5  Min y Max de números leen de un archivo  ( Min and max of numbers read from a file ) 
Tuve que crear este programa, y ​​lo hice bien, todo está trabajando y cosas, pero me preguntaba, ¿qué es mejor hacerlo? Quiero un método más eficiente. Asi...

9  Entrada de usuario y lectura de contenidos de archivo  ( User input and reading contents of file ) 
Para la divulgación completa: esta es una tarea para mi clase de programación y solo quiero consejos o consejos sobre algunos del código. Detalles de asigna...

8  Encuentra el número más grande en una matriz  ( Find the greatest number in an array ) 
El programa lee un archivo .txt que contiene líneas de números. El primero tiene un número N y el segundo tiene números $ N $ a medida que dice la primera l...

2  Saltando espacios en blanco al leer el archivo  ( Skipping whitespaces when reading file ) 
En la lectura de un archivo, encontré líneas en blanco (incluso en la parte inferior) se bloquean el programa. Para solucionar esto, he agregado el siguiente ...

3  Lectura y clasificación de líneas de un archivo  ( Reading and classifying lines from a file ) 
Soy nuevo en C que estoy aprendiendo en la universidad ahora, y no estoy seguro de si lo siguiente se considera en las buenas prácticas o no. Para una asign...

2  Fusionar directorios y mantener archivos que tengan más líneas  ( Merging directories and keep files that have more lines ) 
gol Mi objetivo es combinar directorios. Cada vez que un archivo tiene el mismo nombre en dos o más directorios, solo se debe mantener el número más alto ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos