尝试实现一个小脚本来将旧的日志文件从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)
答案 0 :(得分: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)
答案 1 :(得分: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
参数,以获取实际文件的路径。