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

如何将文件列表传递给python open()方法,python,python-2.7,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 strin

我有一个大约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()
不接受任何元组,只接受字符串)

那么我可以让它处理一系列文件吗


提前谢谢你

open不接受元组,需要字符串,这一点非常正确。因此,您必须逐个迭代文件名:

import re

for path in paths:
    with open(path) as f:
        for line in f:
            if re.match('(.*)version(.*)', line):
                print line
在这里,我使用
路径
作为保存文件名的变量-它可以是元组、列表或其他可以迭代的对象。

使用而不是
打开

此模块实现了一个帮助器类和函数,用于在标准输入或文件列表上快速编写循环

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

例如:

import fileinput

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

只需迭代元组。在这里你不需要正则表达式

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
块时,它们将自动关闭。

如下所示:

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

我的附加值:(1)打印行内容时不显示文件中的哪一行是无用的(2)输出空间不加倍

-1您至少可以逐字复制OP的正则表达式。这一个不起作用。@John实际上,如果你看到OP问题的编辑,这是我开始写作时的原件-现在更新,谢谢提醒@纳西奥:当然,很乐意帮忙!不过,我认为马克·拜尔的回答最适合你的情况。-1你至少可以逐字复制OP的正则表达式。这个不行。@JohnMachin:我确实试着复制原始的regexp。问题是OP没有格式化他的代码,所以
(.*)版本(.*)
看起来像是“(.*)版本(.*)”。请看问题的答案。我期待着你删除你的否决票。@JohnMachin:请记住,你可以编辑我的答案,而不是因为这样的小问题而否决它们。堆栈溢出意味着一个我们改进问题和答案的站点,而不是一个我们互相挑剔的站点。@MartinGeisler:比我想象的更糟糕:你盲目地复制了一个不工作的正则表达式。这不是吹毛求疵。@John:
(.)版本(。
不是“不工作的”。它与“版本”匹配,并捕获每一面的字母。我相信你知道,因为你已经回答了很多正则表达式的问题。您可能还注意到,这个问题与正则表达式无关。它是关于打开列表中的文件。
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()