Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的循环在一次迭代后停止?_Python_Python 2.7_File_Loops_Directory - Fatal编程技术网

Python 为什么我的循环在一次迭代后停止?

Python 为什么我的循环在一次迭代后停止?,python,python-2.7,file,loops,directory,Python,Python 2.7,File,Loops,Directory,我很难理解为什么我的循环在一次迭代后停止 我的代码: 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=

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

我的代码:

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.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”,其中有两个文件“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'])
使用生成器时,您不会得到所有行的列表,而是一个“iterable”,您可以将其称为“lazy reader”,为了使用它,您必须对其进行迭代

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

2

3

4

5

6

数字之间的额外一行是从沿着
\n
打印的文件中读取的
\n
打印添加这样,代码只返回目录的最后一个文件

您没有对打开的文件执行任何操作,然后返回最后一个文件

我想您应该在列表中附加
f.readlines
,然后在函数末尾返回列表


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

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