如何将文件列表传递给python open()方法

时间:2012-02-05 21:59:48

标签: python python-2.7

我有一个大约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 个答案:

答案 0 :(得分: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作为保存文件名的变量 - 它可以是元组或列表或其他可以迭代的对象。

答案 1 :(得分:5)

使用fileinput.input代替open

  

该模块实现了一个辅助类,其功能是在标准输入或文件列表上快速编写循环

     

[...]要指定另一个文件名列表,请将其作为input()的第一个参数传递。也允许使用单个文件名。

示例:

import fileinput

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

答案 2 :(得分: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块时,它们将自动关闭。

答案 3 :(得分: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

答案 4 :(得分: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)没有对输出进行双重空间打印行内容是无用的