我正在尝试一种方法来读取函数中的.txt文件。我的问题是,由于返回值的原因,您似乎无法在函数内使用for循环,而我能想到的唯一方法是while循环,但我在理解它时遇到了问题。
.txt的内部包含一个如下所示的句子
#.txt file
This is a sample sentence .
This is a another sample sentence .
我尝试了列表理解,但是将其存储在列表中。使用for循环读取.txt很容易,但是我想练习使用函数。到目前为止,这是我的进步
def read():
return open ('test.txt','r').read();
def sentence()
while True:
我想要的输出是:
This
is
a
sample
sentence
.
This
is
a
another
sample
sentence
.
答案 0 :(得分:4)
尝试一下:
使用join
添加换行符,并使用split
将这些换行符添加到每个单词
def words_in_file(file):
with open(file,'r') as f:
return f.read().split()
words = words_in_file('test.txt')
print(words)
此打印:
This
is
a
sample
sentence
.
This
is
a
another
sample
sentence
.
答案 1 :(得分:1)
这取决于文件中用于分隔句子(即,将每个句子与下一个句子分隔)的约定。从您的示例中,我将得出猜测,您用于分隔句子的规则可能是“任意数量的空格,包括至少一个换行符”。 (但也可能是“正好是两个换行符”或“一个句点后跟零个或多个空格字符,其中可能包含也可能不包含换行符”。)
在此假设下,这是一个简单的清单,以您想要的方式输出内容:
fullText = open('test.txt', 'rt').read()
for sentence in fullText.split('\n'):
if not sentence.strip():
continue # if what we've got is just a blank (or whitespace-only) line, then skip it
for word in sentence.split():
print(word)
print('') # blank line between sentences
您提到您曾经尝试过列表理解:继续使用它们!它们通常是执行此类操作的最灵活和可维护的方法。它们不会阻止您做您想要做的事情—当然,您可以在list
中获得结果,这只是迈向您想要的输出类型的 intermediate 步骤,但这是有用的表示。重要的是下一步要执行的操作(遍历列表并大概打印每个元素,或者也许将列表'\n'.join()
一起打印,只打印一次结果)。
如果源文本文件很大,或者可能变得很大,答案就会改变。在这种情况下,您可能不想一次性全部.read()
并在内存中进行操作。实际上,您可以做的一件事是使用文件句柄对象本身作为迭代器,一次获取一行:
with open('test.txt', 'rt') as file_handle:
for line in file_handle:
if not line.strip():
continue
for word in line.split():
print(word)
print('')
如果您的句子定界规则更加复杂(例如“句号后接零个或多个空格字符”规则),则方法会再次改变。然后,您应该阅读正则表达式,然后使用re
模块(re.split()
会很有用,但是只有当您在处理正则表达式时才真正有效或易于使用吞噬到内存中的小文件。