2

尝试实现一个小脚本将较旧的日志文件移出 apache(实际上使用简单的 bash 脚本在“现实生活”中执行此操作 - 这只是练习使用 Python 的练习)。我将文件名作为变量f作为字符串获取,但是当我将它传递给self.processFile(root,f,age,inString)时,我希望它实际上是一个文件。

我尝试以几种不同的方式打开实际文件,但我错过了目标,最终得到一个错误,一个似乎并不总是正确的路径,或者只是一个字符串。我会把它归咎于深夜,但我在传递给 self.processFile (它将被 gzip 压缩)之前将 f 作为文件打开的最佳方法是空白。通常我错过了一些非常简单的东西,所以我不得不假设这里就是这种情况。我将不胜感激任何建设性的建议/方向。

 """recursive walk through /usr/local/apache2.2/logs"""
    for root, dirs, files in os.walk(basedir):
            for f in files:
                m=self.fileFormatRegex.match(f)
                if m:
                    if (('access_log.' in f) or
                        ('error.' in f) or
                        ('access.' in f) or
                        ('error_log.' in f) or
                        ('mod_jk.log.' in f)):
                        #This is where i'd like to open the file using the filename f
                        self.processFile(root, f, age, inString)
4

2 回答 2

1

使用os.path.abspath

self.processFile(root, open(os.path.abspath(f)), age, inString)

像这样:

import os
for root, dirs, files in os.walk(basedir):
    for f in files:
        m=self.fileFormatRegex.match(f)
        if m:
            if (set('access_log.', 'error.', 'access.', 'error_log.','mod_jk.log.').intersection(set(f))):
                self.processFile(root, open(os.path.abspath(f)), age, inString)

或者os.path.join

import os
for root, dirs, files in os.walk(basedir):
    for f in files:
        m=self.fileFormatRegex.match(f)
        if m:
            if (set('access_log.', 'error.', 'access.', 'error_log.','mod_jk.log.').intersection(set(f))):
             self.processFile(root, open(os.path.join(r"/", root, f)), age, inString)
             # Sometimes the leading / isnt necessary, like this:
             # self.processFile(root, open(os.path.join(root, f)), age, inString)

更多关于os.path


file()使用代替的另一种方式open()(与打开几乎相同):

self.processFile(root, file(os.path.join(root, f), "r"), age, inString)
self.processFile(root, file(os.path.abspath(f), "r+"), age, inString)
于 2011-09-29T02:50:14.097 回答
1
base = "/some/path"
for root, dirs, files in os.walk(base):
    for f in files:
        thefile = file(os.path.join(root, f))

您必须将root参数加入每个files参数以获取实际文件的路径。

于 2011-09-29T02:52:55.313 回答