如何将文件列表传递给python open()方法
我有一个大约100个文件的列表,我想阅读并匹配一个单词。 这是我写的一段代码如何将文件列表传递给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
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()