2012-02-05 8 views
5

私は約100のファイル形式のリストを持っています。 ここに私が書いたコードがあります。ファイルのリストを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() 

私はこのエラーを取得するyにタプルを渡すしようとするたび:

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

だから私はできる(私はopen()はどの組が、文字列のみを受け入れていないと思います)私はそれがファイルのリストで動作するようになるのですか?

ありがとうございます!!!!

答えて

6

openはタプルを受け入れず、文字列が必要です。ですから、ファイル名の上に一つ一つを反復する必要があります。

import re 

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

ここで私はインクルードファイル名を保持する変数としてpathsを使用する - それはあなたが反復処理することができタプルやリストまたはいくつかの他のオブジェクトにすることができます。

+0

-1少なくとも、OPの正規表現をそのままコピーすることができます。これは動作しません。 –

+0

私は本当にそれを使うつもりだと思う:)...ありがとう!!! – nassio

+0

@nassio:元の正規表現では動作しません –

5

openの代わりにfileinput.inputを使用してください。

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.

例:

import fileinput 

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

'input'の代わりに???????????? –

+3

間違いでした。今すぐ固定!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! –

3

だけでタプルを反復処理します。あなたは正規表現を必要としません。

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

何か:

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あなたは、少なくともOPの正規表現をそのままコピーすることができます。これは動作しません。 –

+1

@ジョン実際、OPの質問の編集を見ると、これは私が執筆を開始した時点のオリジナルでした。今更新されました。ヘッドアップのおかげです! –

+0

@nassio:あなたは誰に感謝していますか? –

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

私の付加価値:(1)それは(2)ダブルスペースの出力をしないファイルにどの行表示せずに行の内容を印刷無用だ

関連する問題