【问题标题】:Why does my loop stop after one iteration?为什么我的循环在一次迭代后停止?
【发布时间】:2019-01-10 07:36:25
【问题描述】:

我很难理解为什么我的循环在一次迭代后就停止了。

我的代码:

import os

def open_data(fpath):
    counter=0
    for i in os.listdir(fpath):
        if os.path.isfile(os.path.join(fpath,i)):
            #print counter
            f=open(os.path.join(fpath,i),"r")
            #counter=counter+1
    return counter,f.readlines()
            #f.close()
x=open_data("C:/Users/manchester/.ipynb_checkpoints/txt_sentoken/practice_")

基本上,我试图遍历目录中包含电影评论的所有文件。我首先打算使用一个函数从目录中读取所有文件,然后我需要说 70% 的评论用于训练 10% 用于测试 10% 用于验证 10% 用于超参数样本。但我就是无法克服尝试使用函数读取所有文件的第一个障碍。

我尝试过使用 list 和 append 但这也不起作用。

【问题讨论】:

  • 为什么你认为你的循环只在一次迭代后就停止了?这个循环应该运行与给定位置的文件一样多的迭代,但你永远不会知道,因为你丢弃了除了最终迭代的结果之外的所有东西。
  • 不确定是否是问题所在,但您在打开 f 后永远不会关闭它
  • 这似乎是学习一些基本调试的好时机。您应该查看循环内和循环后不同变量和项的值,以了解您的代码实际在做什么。
  • 问题与machine-learning 无关 - 请不要向标签发送垃圾邮件(已删除)

标签: python python-2.7 file loops directory


【解决方案1】:

你没有读取所有文件,你只是打开所有文件,在同一个变量中,最后当你在做 f.readlines() f 它只是你最后一个文件,你应该阅读所有文件“缓冲区”并最终返回它

应该是这样的

def open_data(fpath):
    counter=0
    all_lines = []
    for i in os.listdir(fpath):
        if os.path.isfile(os.path.join(fpath,i)):
            all_lines += open(os.path.join(fpath,i),"r").readlines()
            counter=counter+1
    return counter,all_lines

请记住,读取大量最终大文件会在内存中累积,如果您的代码允许,您最好使用生成器

def get_lines(fpath):
    for i in os.listdir(fpath):
        if os.path.isfile(os.path.join(fpath,i)):
            for line in open(os.path.join(fpath,i),"r"):
                yield line
# this would give you an iterable over all the lines in all the files, one line at a time 

后期编辑: 我有一个文件夹“x”,里面有 2 个文件“f1”和“f2”; "f1" 包含数字 1,2,3 每行一个,而 "f2" 包含数字 4,5,6

>>> print open_data(".\\x") # gives
(2, ['1\n', '2\n', '3\n', '4\n', '5\n', '6\n'])

使用生成器,你不会有所有行的列表,而是一个“可迭代”,你可以称它为“懒惰阅读器”,为了使用它,你必须对其进行迭代

>>> for line in get_lines(".\\x"):
...    print line  # will give
1

2

3

4

5

6

数字之间的额外行是从沿\n打印的文件中读取的\n打印添加

【讨论】:

    【解决方案2】:

    这样,代码只会返回目录的最后一个文件。

    你没有对打开的文件做任何事情,然后返回最后一个。

    我猜你应该将f.readlines 附加到一个列表中,然后在函数末尾返回该列表。

    计数器应该可以工作,返回目录中的文件数

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 2022-07-14
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多