文件列表:每4行

2024-10-03 06:20:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从Python中的一个文件中读取,需要创建一个列表列表。每一行是记录中的一个单独的值,每一个记录都由一个空行\n分隔。在

rsfile = 'filepath.txt'
l_s = [[line.rstrip('\n') for line in fileinput.input([rsfile]) if line != '\n']]

这给了我每一行的值列表,并排除了\n,但是我想在更大的列表中开始一个新的子列表或列表块。在

例如。
“1a线”
“第2a行”
“第3a行”
'\n'
“第1b行”
“第2b行”
“第3b行”
'\n'

^{pr2}$

用列表理解可以吗?最初我用这个创建了两个列表

for line in file:
    if line != '\n': l.append(line)

    else: l_of_l.append(l)

    l = []

谢谢你的帮助!在

史蒂文


Tags: 文件intxt列表forinputif记录
3条回答

试试这样的事。。。它起作用了。 “f.txt”是您要读取的文件

f=open('f.txt','r')
list=[[]]
i=0
for line in f:
    if line!='\n':
        list[i].append(line.strip('\n'))
    else:
        list.append([])
        i=+1
        print i
print list

你有空行来分隔应该进入每个子列表的组,对吗?假设您的输入内容不是太庞大而无法立即读入,您可以这样做:

mylines = open("filepath.txt").read()
groups = [ grp.split("\n") for grp in mylines.split("\n\n") ]

第一个split给你三条线组成的组(或其他),第二个从每个组中构建一个子列表。在

如果您试图将内容收集成4行一组,^{} recipes中的grouper函数使其变得微不足道:

groups = grouper(4, file)

这将返回iterable的iterable,尤其是iziplazy iterator over tuples。如果您特别需要列表列表,则需要执行以下操作:

^{pr2}$

由于配方不是标准库模块的一部分,您要么从文档中复制并粘贴函数,要么安装一个名为^{}的第三方模块。在

如果你想要一些稍有不同的东西…好吧,在不知道你想要什么的情况下,很难确切地知道如何编码它,但是你可能会在itertools中找到它。在

例如,假设您希望将其拆分为由空白行分隔的组。我很确定more_itertools中有一个函数可以为您完成这项工作,但是您可以很容易地自己编写一个函数。在

首先,可以使用^{}根据行是否都是空白来分组:

groups = itertools.groupby(file, lambda line: not line.strip())

但是groupby返回key, group对。您只需要group而不需要key。你也只需要非空行的组,而不是所有的组。在

groups = [group for empty, group 
          in itertools.groupby(file, lambda line: not line.strip())
          if not empty]

或者,如果您显式需要一个列表列表,而不是某个任意的iterable类型(在本例中,是_grouperlazy iterables的列表):

groups = [list(group) for empty, group 
          in itertools.groupby(file, lambda line: not line.strip())
          if not empty]

如果您看一下groupby文档,这些示例实际上非常接近于此。在

我可能会把lambda line: not line.strip()分解成一个函数(或者使用more_functools.negate(line.strip),或者…),然后把它写成两行或三行,而不是把它塞进一个大的列表理解中,但是如果你想要一个1行的列表理解(98个字符的行是可以接受的),这就是它。在

相关问题 更多 >