python file iteration

title in python plot



En Python, ¿cómo puedo iterar sobre un iterador y luego sobre otro? (3)

Creo que el enfoque más Pythonic para este problema de archivos en particular es usar el módulo de entrada de fileinput (ya que necesita administradores de contexto complejos o manejo de errores con open ), voy a comenzar con el ejemplo de Ashwini, pero agrego algunas cosas. La primera es que es mejor abrir con la bandera U para soporte Universal Newlines (suponiendo que su Python esté compilada con ella, y la mayoría lo son), ( r es el modo predeterminado, pero explícito es mejor que implícito). Si está trabajando con otras personas, es mejor ayudarlo proporcionándole archivos en cualquier formato.

import fileinput for line in fileinput.input([''file1'', ''file2''], mode=''rU''): pass

Esto también se puede usar en la línea de comandos, ya que tomará sys.argv [1:] si hace esto:

import fileinput for line in fileinput.input(mode=''rU''): pass

Y pasaría los archivos en su caparazón de esta manera:

$ python myscript.py file1 file2

Me gustaría iterar dos iteradores diferentes, algo como esto:

file1 = open(''file1'', ''r'') file2 = open(''file2'', ''r'') for item in one_then_another(file1, file2): print item

Que esperaba imprimir todas las líneas de archivo1, luego todas las líneas de archivo2.

Me gustaría algo genérico, ya que los iteradores podrían no ser archivos, esto es solo un ejemplo. Sé que podría hacer esto con:

for item in [file1]+[file2]:

pero esto lee ambos archivos en la memoria, que preferiría evitar.


También puedes hacerlo con una simple expresión de generador :

for line in (l for f in (file1, file2) for l in f): # do something with line

con este método puede especificar alguna condición en la expresión en sí:

for line in (l for f in (file1, file2) for l in f if ''text'' in l): # do something with line which contains ''text''

El ejemplo anterior es equivalente a este generador con bucle:

def genlinewithtext(*files): for file in files: for line in file: if ''text'' in line: yield line for line in genlinewithtext(file1, file2): # do something with line which contains ''text''


Use itertools.chain :

from itertools import chain for line in chain(file1, file2): pass

fileinput módulo de entrada de fileinput también proporciona una característica similar:

import fileinput for line in fileinput.input([''file1'', ''file2'']): pass