Python:如何将文本目录读入列表

Python:如何将文本目录读入列表,python,Python,我正试图与gensim合作进行主题建模。从模块文档中可以看出,gensim希望以列表的形式接收输入,列表中的每一项都是文本: documents = ["Human machine interface for lab abc computer applications", "A survey of user opinion of computer system response time", "The EPS user interface management s

我正试图与gensim合作进行主题建模。从模块文档中可以看出,gensim希望以列表的形式接收输入,列表中的每一项都是文本:

documents = ["Human machine interface for lab abc computer applications",
        "A survey of user opinion of computer system response time",
        "The EPS user interface management system"]
我有一个目录中的文本集合,我想与gensim一起使用,所以我需要将这些文件读入一个列表。这些文本中的每一个,其中一些由多行组成——文本的大小从100字以下到1000字以上——都需要成为列表中的一项。如果需要剥离换行符,我想我可以想出如何做到这一点,但将其嵌入循环是我失败的地方。。。彻底地事实上,周末我会带自己去环线学校,但我经常把这部分搞砸

我已经找到了关于如何将单个文件读入列表的各种有用信息—通过行、字或其他方式—但我不知道如何将一系列文本文件读入包含在单个列表中的一系列字符串—这是重要的一点:

textfile1.txt
textfile2.txt
需要成为

list = ['contents of textfile1', 'contents of textfile2']
以下是我目前掌握的情况:

# get to the files, open an empty list

import glob

file_list = glob.glob('./texts' + '/*.txt')
documents = []

# Now to read the files into a list:

for file in file_list:
    documents.append()

print documents
打印文档显然是一次性的,所以我可以检查我的工作,你可以看到,我没有在循环中走得太远。

with不是循环。它只运行包含的代码一次。在此上下文中,它保证with块结束后,即使出现错误,打开的文件也将关闭

查看目录中所有文本文件的一种方法是使用os.listdir:

或者作为一种理解:

documents = [f[:-4] for f in os.listdir() if f[-4:] == '.txt']
然后,您将有一个名为documents的列表,其中包含当前工作目录中的文件名。例如,包含hello.txt和world.txt文件的文件夹将生成包含字符串“hello”和“world”的文档

记住,完成后,需要打开文件。建议使用with构造

contents = []
for document in documents:
    with open(document+'.txt', 'r') as f:
        contents.append(f)
这将产生一个内容列表。每个元素都是一个文件对象,可以逐行迭代,也可以以其他方式进行处理,如contents[0]=contents[0]。读取以使用包含文件内容的字符串替换该文件对象。由于with构造,无法理解此项

要回答编辑后的问题(这似乎比原始问题更合理),您可以创建每个文件夹文本文件的字符串内容列表,如下所示:

import glob

file_list = glob.glob('./texts' + '/*.txt')

# create document list:
documents = []
for filename in file_list:
    with open(filename, 'r') as f:
        documents.append(f.read()) # option 1, to get a direct string
        # documents.append(f.readlines()) # option 2, to get a list of lines
        # documents.append([item.strip() for item in f.readlines()]) # option 3, to get a list of lines with no linefeeds
        # documents.append(f.read().replace('\n', ' ') # option 4, to get a direct string, linefeeds replaced with spaces
假设当前工作目录中有一个目录文本,其中first.txt文件包含“hello\nworld”,second.txt文件包含“hi\npeople”,这四个选项中的每一个都会为文档创建不同的结果,如下所示,每条语句都会生成一个与其相应选项等效的列表:

documents=['hello\nworld','hi\npeople'] documents=[['hello\n','world'],['hi\n','people']] 文档=[['hello'、['world']、['hi'、['people']] documents=['hello world','hi people'] 这不是一个循环。它只运行包含的代码一次。在此上下文中,它保证with块结束后,即使出现错误,打开的文件也将关闭

查看目录中所有文本文件的一种方法是使用os.listdir:

或者作为一种理解:

documents = [f[:-4] for f in os.listdir() if f[-4:] == '.txt']
然后,您将有一个名为documents的列表,其中包含当前工作目录中的文件名。例如,包含hello.txt和world.txt文件的文件夹将生成包含字符串“hello”和“world”的文档

记住,完成后,需要打开文件。建议使用with构造

contents = []
for document in documents:
    with open(document+'.txt', 'r') as f:
        contents.append(f)
这将产生一个内容列表。每个元素都是一个文件对象,可以逐行迭代,也可以以其他方式进行处理,如contents[0]=contents[0]。读取以使用包含文件内容的字符串替换该文件对象。由于with构造,无法理解此项

要回答编辑后的问题(这似乎比原始问题更合理),您可以创建每个文件夹文本文件的字符串内容列表,如下所示:

import glob

file_list = glob.glob('./texts' + '/*.txt')

# create document list:
documents = []
for filename in file_list:
    with open(filename, 'r') as f:
        documents.append(f.read()) # option 1, to get a direct string
        # documents.append(f.readlines()) # option 2, to get a list of lines
        # documents.append([item.strip() for item in f.readlines()]) # option 3, to get a list of lines with no linefeeds
        # documents.append(f.read().replace('\n', ' ') # option 4, to get a direct string, linefeeds replaced with spaces
假设当前工作目录中有一个目录文本,其中first.txt文件包含“hello\nworld”,second.txt文件包含“hi\npeople”,这四个选项中的每一个都会为文档创建不同的结果,如下所示,每条语句都会生成一个与其相应选项等效的列表:

documents=['hello\nworld','hi\npeople'] documents=[['hello\n','world'],['hi\n','people']] 文档=[['hello'、['world']、['hi'、['people']] documents=['hello world','hi people']
首先,你显然不知道在开放的情况下应该放什么。。。。嗯,您要打开的是每个*.txt文件。您已经在循环中找到了每个文件的路径。因此,您必须在循环内移动带open的文件才能打开每个文件。正如所解释的,with不是确保文件关闭的循环

接下来,你需要做点什么来 读取每个文件。你说你已经知道如何以你想要的方式读取一个文件,所以我不会解释,我只会使用最简单的东西——文件本身,它是一个可编辑的行,换行符仍然保持不变

最后,您希望将所有列表连接到一个大的平面列表中。通过documents.append,您几乎可以得到这些,但您希望在这里进行扩展。append用于向列表中添加一个元素;extend用于添加来自另一个iterable的所有元素

所以,把它放在一起:

import glob

file_list = glob.glob('./texts' + '/*.txt')
documents = []

for file_path in file_list:
    with open(file_path) as f:
        documents.extend(f)

print documents
虽然这是你最初要求的,但显然不是你想要的。您希望每个文件的内容都是一个巨大的字符串。那同样容易。f、 read将文件的内容作为一个巨大的字符串读取。当然,现在您需要追加,而不是扩展,因为您只需要添加一个新内容,而不是它们的列表。因此:

import glob

file_list = glob.glob('./texts' + '/*.txt')
documents = []

for file_path in file_list:
    with open(file_path) as f:
        documents.append(f.read())

print documents

实际上,一旦你知道如何以你想要的任何格式读取单个文件,一个大字符串,每行的字符串列表,每行的行列表,它们本身就是单词列表或CSV列…,在多个文件上执行相同的操作只是将代码封装在一个循环中,该循环使用list.append或list.extend存储结果,最坏的情况是,类似于dict[key]=value或dict.setdefaultkey,[].appendvalue。这一切都很简单。

首先,你显然不知道在打开的情况下放什么。。。。嗯,您要打开的是每个*.txt文件。您已经在循环中找到了每个文件的路径。因此,您必须在循环内移动带open的文件才能打开每个文件。正如所解释的,with不是确保文件关闭的循环

接下来,您需要做一些事情来读取每个文件。你说你已经知道如何以你想要的方式读取一个文件,所以我不会解释,我只会使用最简单的东西——文件本身,它是一个可编辑的行,换行符仍然保持不变

最后,您希望将所有列表连接到一个大的平面列表中。通过documents.append,您几乎可以得到这些,但您希望在这里进行扩展。append用于向列表中添加一个元素;extend用于添加来自另一个iterable的所有元素

所以,把它放在一起:

import glob

file_list = glob.glob('./texts' + '/*.txt')
documents = []

for file_path in file_list:
    with open(file_path) as f:
        documents.extend(f)

print documents
虽然这是你最初要求的,但显然不是你想要的。您希望每个文件的内容都是一个巨大的字符串。那同样容易。f、 read将文件的内容作为一个巨大的字符串读取。当然,现在您需要追加,而不是扩展,因为您只需要添加一个新内容,而不是它们的列表。因此:

import glob

file_list = glob.glob('./texts' + '/*.txt')
documents = []

for file_path in file_list:
    with open(file_path) as f:
        documents.append(f.read())

print documents

实际上,一旦你知道如何以你想要的任何格式读取单个文件,一个大字符串,每行的字符串列表,每行的行列表,它们本身就是单词列表或CSV列…,在多个文件上执行相同的操作只是将代码封装在一个循环中,该循环使用list.append或list.extend存储结果,最坏的情况是,类似于dict[key]=value或dict.setdefaultkey,[].appendvalue。这很简单。

文档中的字符串是不是要作为文件名删除扩展名?每个文件路径都是要读取的文件的路径名。因此,具有open的…必须具有openfile_路径。这显然意味着你的结构是错误的:with必须在for循环中,而不是在它之前。同时,如果你知道如何将单个文件读入一个列表,请在with语句中编写代码,那么我们可以向你展示如何将这些列表连接在一起。提示:这是extend方法,或者+=操作符。好吧,我在这里的第一堂课是不要在晚上发布,显然,我太累了,写不出一个合理的问题。所以,首先,我要非常感谢你们,感谢你们破译了我和他们一样多的愚蠢问题。为了清楚起见,我编辑了这个问题。不客气,谢谢你澄清这个问题。我已经编辑了我的答案-希望它能有所帮助。文档中的字符串是不是要作为文件名删除扩展名?嗯,每个文件路径都是要读取的文件的路径名。因此,具有open的…必须具有openfile_路径。这显然意味着你的结构是错误的:with必须在for循环中,而不是在它之前。同时,如果你知道如何将单个文件读入一个列表,请在with语句中编写代码,那么我们可以向你展示如何将这些列表连接在一起。提示:这是extend方法,或者+=操作符。好吧,我在这里的第一堂课是不要在晚上发布,显然,我太累了,写不出一个合理的问题。所以,首先,我要非常感谢你们,感谢你们破译了我和他们一样多的愚蠢问题。为了清楚起见,我编辑了这个问题。不客气,谢谢你澄清这个问题。我编辑了我的答案——希望能有所帮助。他已经在使用glob.glob;他也不需要os.listdir。我对glob.glob不太熟悉,所以我用了os.listdir。如果能看到一个
n也用glob.glob回答。他的问题已经是glob的一个很好的例子……除了关于不打开他找到的每个文件的部分。他已经在使用glob.glob;他也不需要os.listdir。我对glob.glob不太熟悉,所以我用了os.listdir。看到glob.glob的答案也很好。他的问题已经是glob的一个很好的例子……除了关于不打开他找到的每个文件的部分。首先,感谢你花时间回答这个问题,并写一个解释这么多的答案。这些解释很有帮助。除了将文本中的每一行都转换为列表中的一个项目外,这是可行的。有没有办法让文本文件的全部内容成为列表中的一项?首先,感谢您花时间回答这个问题,并写一个解释这么多的答案。这些解释很有帮助。除了将文本中的每一行都转换为列表中的一个项目外,这是可行的。有没有办法让文本文件的全部内容成为列表中的一项?