6

我是 python 编程的新手。我有这个问题:我有一个文本文件列表(压缩和未压缩),我需要: - 连接到服务器并打开它们 - 打开文件后,我需要获取他的内容并将其传递给另一个我写的python函数

def readLogs (fileName):
f = open (fileName, 'r')
inStream = f.read()
counter = 0
inStream = re.split('\n', inStream) # Create a 'list of lines'
out = ""              # Will contain the output
logInConst = ""       # log In Construction
curLine = ""          # Line that I am working on

for nextLine in inStream:
    logInConst += curLine  
    curLine = nextLine
    #   check if it is a start of a new log && check if the previous log is 'ready'
    if newLogRegExp.match(curLine) and logInConst != "":

        counter = counter + 1

        out = logInConst
        logInConst = ""
        yield out

yield logInConst + curLine

def checkFile (regExp, fileName):
    generatore = readLogs(fileName)
    listOfMatches=[]

    for i in generatore: #I'm now cycling through the logs
        # regExp must be a COMPILE regular expression
        if regExp.search(i):
            listOfMatches.append(i)
    return listOfMatches

为了详细说明这些文件中包含的信息。该函数的目的是使用 3 行仅在 1 行中写入存储在这些文件中的日志......该函数在从我的本地计算机读取的文件上运行良好,但我无法弄清楚如何连接到远程服务器和创建这些单行日志而不将每个文件的内容存储到一个字符串中,然后使用该字符串......我用来连接到远程机器的命令是:

connection_out = Popen(['ssh', retList[0], 'cd '+retList[2]+'; cat'+fileName], stdout=PIPE).communicate()[0]

retList[0] 和 retList[2] 是 user@remote 和我必须访问的文件夹名称

提前感谢大家!

更新:

我的问题是我必须先建立一个 ssh 连接:

pr1=Popen(['ssh', 'siatc@lgssp101', '*~/XYZ/AAAAA/log_archive/00/MSG_090308_162648.gz*' ], stdout=PIPE).communicate()[0]

我需要打开的所有文件都存储在一个列表中,fileList[],其中一部分是压缩的(.gz),一部分只是文本文件!我已经尝试了你在 bot 之前展示的所有程序,但没有任何效果......我想我必须修改 Popen 函数的第三个参数,但我不知道该怎么做!有没有人可以帮助我???

4

4 回答 4

5

您不必自己将流/文件拆分为行。只需迭代:

for ln in f:
    # work on line in ln

这对于文件(使用 open() 处理 file())和管道(使用 Popen)同样适用。使用stdoutpopen对象的属性访问连接到子进程stdout的管道

例子

from subprocess import Popen, PIPE
pp = Popen('dir', shell=True, stdout=PIPE)

for ln in pp.stdout:
    print '#',ln
于 2009-03-16T15:48:11.587 回答
1

删除 InStream 并仅使用文件对象。

这样您的代码将显示为:

for nextLine in f.readlines():
    .
    .
    .

贝尔说得对。

澄清一下,文件对象的默认迭代行为是返回下一行。所以“ for nextLine in f ”会给你与“ for nextLine in f.readlines() ”相同的结果。

有关详细信息,请参阅文件对象文档:http: //docs.python.org/library/stdtypes.html#bltin-file-objects

于 2009-03-16T16:45:49.843 回答
0

如果你想通过 ssh 做一些事情,为什么不使用Python SSH 模块呢?

于 2009-04-28T10:11:44.473 回答
0

试试这个页面,到目前为止我找到的关于 popen 的最佳信息....

http://jimmyg.org/blog/2009/working-with-python-subprocess.html

于 2011-10-03T17:20:53.863 回答