как передать список файлов в метод python open () - PullRequest
5 голосов
/ 06 февраля 2012

У меня есть список из примерно 100 файлов, которые я хотел прочитать и сопоставить одно слово.Вот фрагмент кода, который я написал.

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

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

var1.close() 

каждый раз, когда я пытаюсь передать кортеж y, я получаю эту ошибку:

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

(я думаю, что open() непринимать любые кортежи, но только строки)

Так я мог бы заставить его работать со списком файлов?

Заранее спасибо !!!!

Ответы [ 5 ]

6 голосов
/ 06 февраля 2012

Вы совершенно правы, что open не принимает кортеж и нуждается в строке. Поэтому вы должны перебирать имена файлов по одному:

import re

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

Здесь я использую paths в качестве переменной для хранения имен файлов - это может быть кортеж, список или какой-то другой объект, который вы можете перебирать.

5 голосов
/ 06 февраля 2012

Используйте fileinput.input вместо open.

Этот модуль реализует вспомогательный класс и функции для быстрой записи цикла поверх стандартного ввода или списка файлов

[...] Чтобы указать альтернативный список имен файлов, передайте его в качестве первого аргумента для input (). Допускается также одно имя файла.

Пример:

import fileinput

for line in fileinput.input(list_of_files):
    # etc...
3 голосов
/ 06 февраля 2012

Просто итерируйте по кортежу.И здесь вам не нужно регулярное выражение.

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

Использование оператора with таким способом также избавляет вас от необходимости закрывать файлы, с которыми вы работаете.Они будут закрыты автоматически при выходе из блока with.

2 голосов
/ 06 февраля 2012

Примерно так:

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 голосов
/ 06 февраля 2012
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()

Мое добавленное значение: (1) бесполезно печатать содержимое строки, не показывая, какая строка в каком файле (2) не удваивает вывод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...