1

我必须从 .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

我不知道哪里出了问题,所以它返回一个完全空的列表。我也不确定''and'\n'部分;我正在使用的示例测试文件在 shell 中打开时如下所示:

milk\n
cheese\n
\n
...
''
''

但是对于每个列表.rstrip()是否!= ''有意义?还是我什至没有走在正确的轨道上?

4

4 回答 4

4

一个问题是您没有将最终结果添加sublist到结果中。正如@Xymotech 提到的,您需要捕获每次调用的结果,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语句的使用。这可确保文件在不再需要后关闭。

于 2012-11-13T05:11:02.940 回答
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
于 2012-11-13T06:11:44.167 回答
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']]
于 2012-11-13T06:19:08.507 回答
1

每次你调用 L.readline() 时,你都在读另一行。您应该第一次存储它的值,并在接下来的每个语句中使用该值。

于 2012-11-13T05:05:34.890 回答