我有几个python文件,我想在不同的目录中运行,它将从100个文件中搜索特定模式。假设我在/home/jay
目录中有python文件,我在/home/jay/data
目录中有100个文件。
我能做些什么来实现这个目标?
我的python代码是:
import re
import os
os.chdir(r'/home/jay/data/')
files = open('*')
for line in files :
line = line.rstrip()
if re.search('Model' , line):
print(line)
我收到了以下错误:
Traceback (most recent call last):
File "/home/jay/test.py", line 4, in ?
files = open('*')
IOError: [Errno 2] No such file or directory: '*'
答案 0 :(得分:2)
您正在寻找os.listdir
。它将为您提供指定目录中所有文件名的列表,默认为当前目录。 '*'
不起作用的原因是它是由shell扩展的命令行构造。您只能在支持这种扩展的shell或脚本中使用它。由于open
未通过shell,因此它会尝试查找实际名为*
的文件。此外,open
一次只能处理一个文件。
import os, os.path, re os.chdir(r'/home/jay/data/') files = os.listdir() for name in files: # Skip directories if os.path.isdir(name): continue with open(name) as file: for line in file: line = line.rstrip() if re.search('Model' , line): print(line)
话虽如此,作为个人喜好,我通常会避免使用os.chdir
。相反,我更喜欢使用os.path.join
指定完整路径。以下是您重写的示例:
from os import listdir
from os.path import join, isdir
folder = '/home/jay/data'
files = listdir(folder)
for name in files:
name = join(folder, name)
# Skip directories
if isdir(name):
continue
with open(name) as file:
for line in file:
line = line.rstrip()
if 'Model' in line:
print(line)
我冒昧地完全删除了正则表达式,因为它只会减慢你有很多文件的速度。如果您使用正则表达式来处理更复杂的场景,请在使用re.compile
之前进行编译。
此外,如果需要,您可以在这里自由使用相对路径。例如,如果您始终从/home/jay
开始投放,则可以在第二个示例中设置folder = 'data'
而不是folder = '/home/jay/data'
。