2012-02-05 12 views
5

Tengo una lista de alrededor de 100 archivos que quería leer y unir una palabra. Aquí está la pieza de código que escribí.cómo pasar una lista de archivos al método python open()

import re 
y = 'C:\\prova.txt' 
var1 = open(y, 'r') 

for line in var1: 
    if re.match('(.*)version(.*)', line): 
     print line 

var1.close() 

cada vez que trato de pasar una tupla a y me sale este error:

TypeError: coercing to Unicode: need string or buffer, tuple found. 

(creo que open() no acepta ninguna tupla pero sólo cadenas)

Así que pude Lo consigo para trabajar con una lista de archivos?

Gracias de antemano !!!!

Respuesta

6

Tiene toda la razón que open no acepta una tupla y necesita una cadena. Así que hay que iterar sobre los nombres de los archivos uno por uno:

import re 

for path in paths: 
    with open(path) as f: 
     for line in f: 
      if re.match('(.*)version(.*)', line): 
       print line 

Aquí uso paths como la variable de la bodega de los nombres de los archivos - puede ser una tupla o una lista o algún otro objeto que se puede recorrer en iteración .

+0

-1 Podrías haber copiado al menos la expresión regular del OP textualmente. Este no funciona –

+0

Realmente creo que voy a usarlo:) ... muchas gracias! – nassio

+0

@nassio: no va a funcionar con su expresión regular original –

5

Utilice fileinput.input en lugar de open.

This module implements a helper class and functions to quickly write a loop over standard input or a list of files

[...] To specify an alternative list of filenames, pass it as the first argument to input(). A single file name is also allowed.

Ejemplo:

import fileinput 

for line in fileinput.input(list_of_files): 
    # etc... 
+0

En lugar de 'input' ????????????? –

+3

Fue un error. Corregido ahora gracias !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! –

3

Sólo iterar sobre la tupla. Y no necesitas una expresión regular aquí.

y = ('C:\\prova.txt', 'C:\\prova2.txt') 
for filename in y: 
    with open(filename) as f: 
     for line in f: 
      if 'version' in line: 
       print line 

Utilización de la sentencia with esta manera también le ahorra tener que cerrar los archivos con los que trabaja. Se cerrarán automáticamente cuando se salga del bloque with.

2

Algo como esto:

import re 

files = ['a.txt', 'b.txt'] 
for f in files: 
    with open(f, 'r') as var1: 
    for line in var1: 
     if re.match('(.*)version(.*)', line): 
     print line 
+0

-1 Podrías haber copiado al menos la expresión regular del OP textualmente. Este no funciona –

+1

@John En realidad, si ves las ediciones de la pregunta del OP, este era el original en el momento en que comencé a escribir, actualizado ahora, ¡gracias por el aviso! –

+0

@nassio: ¿A quién le das las gracias, para qué? –

0
def simple_search(filenames, query): 
    for filename in filenames: 
     with open(filename) as f: 
      for line_num, line in enumerate(f, 1): 
       if query in line: 
        print filename, line_num, line.strip() 

Mi valor añadido: (1) que es inútil imprimir el contenido de la línea sin mostrar qué línea en la que el archivo (2) no se doble espacio de la salida

Cuestiones relacionadas