我有一个大约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()
不接受任何元组,只接受字符串)
所以我可以让它使用文件列表吗?
提前谢谢!!!!
答案 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)没有对输出进行双重空间打印行内容是无用的