2012-02-05 34 views
5

Tôi có danh sách khoảng 100 tệp mà tôi muốn đọc và khớp một từ. Đây là đoạn mã tôi đã viết.cách chuyển danh sách tệp sang python phương thức open()

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

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

var1.close() 

mỗi khi tôi cố gắng để vượt qua một tuple để y tôi nhận được lỗi này:

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

(Tôi nghĩ rằng open() không chấp nhận bất kỳ tuple nhưng chỉ strings)

Vì vậy, tôi có thể Tôi nhận được nó để làm việc với một danh sách các tập tin?

Cảm ơn bạn trước !!!!

Trả lời

6

Bạn hoàn toàn chính xác rằng open không chấp nhận tuple và cần chuỗi. Vì vậy, bạn phải lặp qua các tên file từng cái một:

import re 

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

Ở đây tôi sử dụng paths là biến những giữ tên tập tin - nó có thể là một tuple hoặc một danh sách hoặc một số đối tượng khác mà bạn có thể duyệt qua .

+0

-1 Bạn có thể ít nhất đã sao chép đúng nguyên văn regex của OP. Cái này không hoạt động. –

+0

Tôi thực sự nghĩ rằng tôi sẽ sử dụng nó:) ... cảm ơn rất nhiều !!! – nassio

+0

@nassio: nó sẽ không hoạt động với regex gốc của bạn –

5

Sử dụng fileinput.input thay vì 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.

Ví dụ:

import fileinput 

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

Thay vì 'đầu vào' ?????????????? –

+3

Đã xảy ra lỗi. Đã sửa lỗi nhờ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! –

3

Chỉ cần lặp qua các tuple. Và bạn không cần một regex ở đây.

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 

Sử dụng tuyên bố with theo cách này cũng giúp bạn không phải đóng các tệp bạn đang làm việc. Chúng sẽ tự động bị đóng khi khối with bị thoát.

2

Something như thế này:

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 Bạn có thể ít nhất đã sao chép chính tả regex của OP. Cái này không hoạt động. –

+1

@John Trên thực tế, nếu bạn thấy các chỉnh sửa của câu hỏi của OP, đây là bản gốc tại thời điểm tôi bắt đầu viết - cập nhật ngay bây giờ, cảm ơn những người đứng đầu! –

+0

@nassio: Bạn đang cảm ơn ai vì điều gì? –

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

giá trị gia tăng của tôi: (1) nó vô dụng in các nội dung dòng mà không hiển thị mà dòng trong đó tập tin (2) không tăng gấp đôi không gian đầu ra

Các vấn đề liên quan