如何将由空行分隔的行进行分组,使其更符合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
。