如何在不同的目录

时间:2017-08-01 17:59:54

标签: python python-3.x

我有几个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: '*'

1 个答案:

答案 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'