读取或读取线的Python自定义分隔符

时间:2017-07-25 13:14:52

标签: python delimiter readline

我正在与subprocess进行交互,并试图检测它何时准备好输入。我遇到的问题是读取或readline函数依赖于行尾的'\ n'分隔符,或者产生EOF。由于此subprocess永不退出,因此文件中没有像EOF这样的对象。由于我想要触发的关键字不包含该分隔符,因此读取和readline函数永远不会产生。例如:

'Doing something\n'
'Doing something else\n'
'input>'

由于此过程永远不会退出,因此读取或读取行永远不会看到它需要产生的EOF\n

有没有办法像对象一样读取此文件并将自定义分隔符设置为input>

1 个答案:

答案 0 :(得分:3)

您可以实现自己的readlines功能并自行选择分隔符:

def custom_readlines(handle, line_separator="\n", chunk_size=64):
    buf = ""  # storage buffer
    while not handle.closed:  # while our handle is open
        data = handle.read(chunk_size)  # read `chunk_size` sized data from the passed handle
        if not data:  # no more data...
            break  # break away...
        buf += data  # add the collected data to the internal buffer
        if line_separator in buf:  # we've encountered a separator
            chunks = buf.split(line_separator)
            buf = chunks.pop()  # keep the last entry in our buffer
            for chunk in chunks:  # yield the rest
                yield chunk + line_separator
    if buf:
        yield buf  # return the last buffer if any

不幸的是,由于Python默认缓冲策略,如果您正在调用的进程不提供大量数据,您将无法获取大量数据,但您始终可以设置chunk_size1然后按字符读取输入字符。因此,对于您的示例,您需要做的就是:

import subprocess

proc = subprocess.Popen(["your", "subprocess", "command"], stdout=subprocess.PIPE)

while chunk in custom_readlines(proc.stdout, ">", 1):
    print(chunk)
    # do whatever you want here...

它应该从子进程的STDOUT中捕获最多>的所有内容。您也可以在此版本中使用多个字符作为分隔符。