问题描述
我目前有这个代码:
for line in iter(command.stderr.readline,b''):
line = line.rstrip().decode('utf8')
logger.debug(line)
我从中读取 stderr 的命令是 rsync。有时,日志中会出现多行作为单个条目,而我只想在每个日志消息中记录一个操作。
例如,日志输出如下:
DEBUG: copying .... gs://xxxxx
DEBUG: copying .... gs://xxxxx copying .... gs://xxxxx copying .... gs://xxxxx copying .... gs://xxxxx
DEBUG: copying gs://xxxxx
正如上面所希望的那样,它没有成功地将 stderr 的每一行拆分出来。
我希望将每一行都分开,以便每一行都以“复制”开头。我怎样才能从 stderr 获取这个 readline 输出并进一步过滤它,以便每次出现“复制”这个词时都会产生一个新行?
谢谢,如果我能说得更清楚,请告诉我。
解决方法
如果我理解正确,您只想拆分包含多个复制操作的行。为此,您可以在任何字符之后(以防止第一个字符串为空)和 date month_start_date
0 2018-08-01 1
1 2018-08-02 2
2 2018-08-03 3
3 2018-08-04 4
4 2018-08-05 5
之前对 re.split
使用正则表达式:
"Copying"
在您的循环中,这可能看起来例如像这样(未测试):
>>> s = "Copying .... Copying .... Copying .... Copying ...."
>>> re.split("(?<=.)(?=Copying)",s)
['Copying .... ','Copying .... ','Copying ....']
注意:在 Python 3.7 中的 re.split
中添加了对空模式的拆分