我正在努力查看为什么我的循环在一次迭代后会停止。
我的代码:
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%的超参数采样。但是我无法克服尝试使用函数读取所有文件的第一个障碍。
我尝试使用列表和追加,但这也不起作用。
答案 0 :(得分:0)
您不会读取所有文件,而是只打开同一变量中的所有文件,最后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
以后编辑: 我有一个包含两个文件“ f1”和“ f2”的文件夹“ x”; “ 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
打印的文件中读取的
答案 1 :(得分:0)
这样,代码将只返回目录的最后一个文件。
您没有对打开的文件执行任何操作,然后返回最后一个文件。
我想您应该将'Sheet 2'!B:E
附加在列表中,然后在函数末尾返回列表。
虽然计数器应该可以工作,返回目录中的文件数