基本上我想从文本文件中读取字符串,将它们三乘三地放入列表中,然后将所有这三乘三列表放入另一个列表中。其实让我解释得更好:)
文本文件(只是一个例子,我可以根据需要构建它):
party
sleep
study
--------
party
sleep
sleep
-----
study
sleep
party
---------
等等
据此,我希望 Python 创建一个如下所示的列表:
List1 = [['party','sleep','study'],['party','sleep','sleep'],['study','sleep','party']etc]
但是这太难了。我正在尝试类似的东西:
test2 = open('test2.txt','r')
List=[]
for line in 'test2.txt':
a = test2.readline()
a = a.replace("\n","")
List.append(a)
print(List)
但这只会做可怕的事情。如何实现?
请您参考如下方法:
如果你想以 3 的大小对数据进行分组。假设文本文件中的数据未按任何分隔符分组。
您需要按顺序读取文件并创建一个列表。要对其进行分组,您可以使用任何已知的 grouper algorithms
from itertools import izip, imap
with open("test.txt") as fin:
data = list(imap(list, izip(*[imap(str.strip, fin)]*3)))
pprint.pprint(data)
[['party', 'sleep', 'study'],
['party', 'sleep', 'sleep'],
['study', 'sleep', 'party']]
执行步骤
- 使用文件对象创建上下文管理器。
- 去除每一行。 (删除换行符)
- 在大小为 3 的迭代器列表上使用 zip,确保项目被分组为三个项目的元组
- 将元组转换为列表
- 将生成器表达式转换为列表。
考虑到所有都是生成器表达式,它在一次迭代中完成。
相反,如果您的数据由分隔符 ------ 分隔和分组,您可以使用 itertools.groupby 解决方案
from itertools import imap, groupby
class Key(object):
def __init__(self, sep):
self.sep = sep
self.count = 0
def __call__(self, line):
if line == self.sep: self.count += 1
return self.count
with open("test.txt") as fin:
data = [[e for e in v if "----------" not in e]
for k, v in groupby(imap(str.strip, fin), key = Key("----------"))]
pprint.pprint(data)
[['party', 'sleep', 'study'],
['party', 'sleep', 'sleep'],
['study', 'sleep', 'party']]
执行步骤
- 创建一个键类,以在遇到分隔符时增加一个计数器。除了有条件地增加它之外,每次调用函数调用都会吐出计数器。
- 使用文件对象创建上下文管理器。
- 去除每一行。 (删除换行符)
- 使用
itertools.groupby和自定义键对数据进行分组 - 从分组数据中删除分隔符并创建组列表。
