我必须从.txt文件构建一个购物清单的功能,如下所示:
milk
cheese
bread
hotdog buns
chicken
tuna
burgers
等等。从上面的列表中,我的购物清单应该看起来像[['milk', 'cheese'], ['bread', 'hotdog buns'], ['chicken', 'tuna', 'burgers']]
,所以当文本文件中有一个空格时,项目被分开的列表列表。
我必须使用.readline()
,我无法使用.readlines(), .read()
或for
循环。我的代码现在创建一个空列表:
def grocery_list(foods):
L = open(foods, 'r')
food = []
sublist = []
while L.readline() != '':
if L.readline() != '\n':
sublist.append(L.readline().rstrip('\n'))
elif L.readline() == '\n':
food.append(sublist)
sublist = []
return food
我不知道它出错了所以它返回一个完全空的列表。我也不确定''
和'\n'
部分;我正在使用的示例测试文件,在shell中打开时,如下所示:
milk\n
cheese\n
\n
...
''
''
但.rstrip()
或整个!= ''
对每个列表都有意义吗?或者我甚至没有走上正确的轨道?
答案 0 :(得分:4)
一个问题是您没有将最终sublist
添加到结果中。正如@Xymostech所提到的,您需要将每次调用的结果捕获到readline()
,因为下一个调用将是不同的。以下是我修改代码的方法。
def grocery_list(foods):
with open(foods, 'r') as L:
food = []
sublist = []
while True:
line = L.readline()
if len(line) == 0:
break
#remove the trailing \n or \r
line = line.rstrip()
if len(line) == 0:
food.append(sublist)
sublist = []
else:
sublist.append(line)
if len(sublist) > 0:
food.append(sublist)
return food
注意使用with
语句。这可确保文件在不再需要后关闭。
答案 1 :(得分:2)
我已经修改了您的代码,以实现您想要的目标:
def grocery_list(foods):
with open(foods,'r') as f:
food=[]
sublist=[]
while True:
line=f.readline()
if len(line)==0:
break
if line !='\n':
sublist.append(line.strip())
else:
food.append(sublist)
sublist=[]
food.append(sublist)
return food
答案 2 :(得分:2)
在我看来,有点整洁。另一种获得所需结果的选择。
def grocerylist(foods):
with open(foods) as f:
line = f.readline()
items = []
while line:
items.append(line.rstrip())
line = f.readline()
newlist = [[]]
for item in a:
if not x: newlist.append([])
else: newlist[-1].append(x)
return newlist
newlist
现在包含以下内容:
[['milk', 'cheese'], ['bread', 'hotdog buns'], ['chicken', 'tuna', 'burgers']]
答案 3 :(得分:1)
每次你打电话给L.readline(),你都会读到另一行。您应该第一次存储它的值,并在每个下一个语句中使用该值。