如何将由空行分隔的行进行分组,使其更符合pythonical

如何将由空行分隔的行进行分组,使其更符合pythonical,python,python-3.x,Python,Python 3.x,我有一个文件,其中包含重复但命名唯一的文件列表 例如: <md5sum> /var/www/one.png <md5sum> /var/www/one-1.png <md5sum> /var/www/two.png <md5sum> /var/www/two-1.png <md5sum> /var/www/two-2.png 这是我先前运行的命令的输出。现在我需要处理这个输出,我为初学者提供了以下代码: from ppri

我有一个文件,其中包含重复但命名唯一的文件列表

例如:

<md5sum>  /var/www/one.png
<md5sum>  /var/www/one-1.png

<md5sum>  /var/www/two.png
<md5sum>  /var/www/two-1.png
<md5sum>  /var/www/two-2.png
这是我先前运行的命令的输出。现在我需要处理这个输出,我为初学者提供了以下代码:

from pprint import pprint
DUPES_FILE = './dupes.txt'

def process_dupes(dupes_file):
    groups = [[]]
    index = 0
    for line in dupes_file:
        if line != '\n':
            path = line.split('  ')[1]
            groups[index].append(path)
        else:
            index += 1
            groups.append([])

    pprint(groups)

with open(DUPES_FILE, 'r') as dupes_file:
    process_dupes(dupes_file)

有没有更简洁的方法来写这个?

将整个文件读入一个变量。使用
split(“\n\n”)
将其分成重复的组,然后使用
split(“\n”)
将其拆分以获得每一行,最后使用
split(“”
拆分每一行

def process_dupes(dupes_file)
    contents = dupes_file.read()
    groups = [[line.split("  ")[1] for line in group.split("\n") if line != ""] for group in contents.split("\n\n")]

稍好一点的版本。还处理组之间有多条新行时的情况

def get_groups(dupes_file):
    group = []
    for line in dupes_file:
        if line == "\n":
            if group:
                yield group
                group = []
        else:
            md5sum, path = line.split('  ')
            group.append(path.strip())
    if group:
        yield group
输出:

In [61]: with open(DUPES_FILE, 'r') as dupes_file:
    ...:     pprint(list(get_groups(dupes_file)))
    ...:     
    ...:     
[['/var/www/one.png\n', '/var/www/one-1.png\n'],
 ['/var/www/two.png\n', '/var/www/two-1.png\n', '/var/www/two-2.png\n']]
如果这令人困惑,您的版本的一个改进就是忽略删除索引变量并使用
-1
,因为您总是想添加到最后一个列表中

def process_dupes(dupes_file):
    groups = [[]]
    for line in dupes_file:
        if line != '\n':
            path = line.split('  ')[1]
            groups[-1].append(path)
        else:
            groups.append([])

    pprint(groups)

下面将迭代处理文件中的数据,而不是首先将整个内容读入内存:

from itertools import groupby
from pprint import pprint

DUPES_FILE = './dupes.txt'

def process_dupes(dupes_file):
    groups = [
        [line.rstrip().split('  ')[1] for line in lines]
            for blank, lines in groupby(dupes_file, lambda line: line == '\n')
                if not blank
    ]
    pprint(groups)

with open(DUPES_FILE, 'r') as dupes_file:
    process_dupes(dupes_file)
输出:

In [61]: with open(DUPES_FILE, 'r') as dupes_file:
    ...:     pprint(list(get_groups(dupes_file)))
    ...:     
    ...:     
[['/var/www/one.png\n', '/var/www/one-1.png\n'],
 ['/var/www/two.png\n', '/var/www/two-1.png\n', '/var/www/two-2.png\n']]
[['/var/www/one.png','/var/www/one-1.png'],
['/var/www/two.png'、'/var/www/two-1.png'、'/var/www/two-2.png']

变量
索引的作用是什么?它与groups变量一起使用。您真的想在输出中保留行尾字符吗?>我刚刚添加了一个结果示例。我得到:indexer:list index超出范围
group.split()
包含文件最后一行的空行,因此必须使用
if line!=“”
。您需要从路径中修剪
\n