2

我是编程新手,正在玩 Python 脚本。

我正在尝试编写一个 Python 脚本,该脚本将读取一个文本文件并打印到屏幕上,搜索一个单词,每次找到该单词时,都会拆分该行的数据。

test.txt 文件类似于:

ape bear cat dog ape elephant frog giraffe ape horse iguana jaguar

我希望屏幕上的最终结果如下所示:

ape bear cat dog
ape elephant frog giraffe
ape horse iguana jaguar

到目前为止我的代码:

file = "test.txt"
read_file = open(file, "r")
with read_file as data:
    read_file.read()
    print(data)
    word = "ape"
    for word in data:
        data.split()
        print(data)

我将文件设为变量,因为我打算在脚本中多次使用它。

当我测试代码时,for循环并没有在一个循环后停止。它最终结束了,但我确定是代码还是程序自动结束了无限循环。

如何编辑代码,以便 for 循环在到达文件末尾时停止?有没有更正确的方法来编写这段代码?

同样,这只是一个示例文件,而不是我的实际文件。谢谢!

4

7 回答 7

3
>>> f = open("test.txt")
>>> a = f.read()
>>> f.close()
>>> a = a.replace("ape", "\nape")
>>> print(a)

ape bear cat dog
ape elephant frog giraffe
ape horse iguana jaguar
于 2013-08-20T14:25:39.170 回答
2
fileName = "test.txt"
read_file = open(fileName, "r")
with read_file as open_file:
    data = open_file.read().rstrip()
    keyword = "ape"
    data = ' '.join(["\n"*(word == keyword) + word for word in data.split()]).strip()
#   data = data.replace(keyword, "\n"+keyword).strip()
    print(data)

输出:

# ape bear cat dog 
# ape elephant frog giraffe 
# ape horse iguana jaguar
于 2013-08-20T14:35:00.927 回答
1

试试这个,它完全符合你的意图:

file = "test.txt"
word = 'ape'
read_file = open(file, "r")
with read_file as data:
    for line in data:
        sp = line.split(word)
        for s in sp:
            if s:
                print(word + s)
于 2013-08-20T14:30:25.653 回答
1

假设您正在尝试学习控制流并且没有尝试使用正则表达式或替换内容......

看起来你正在尝试做这样的事情(内联评论):

filename = 'test.txt'               # `file` is a Python built-in
with open(filename, 'r') as data:   # Open the file and close it when we're done
    for line in data:               # This will read one line at a time and exit the loop at EOF
        for word in line.strip().split():  # Strip off the newline and split the line into words
            if word == 'ape':       # If we've found our keyword
                print               #     Then Print a newline
            print word,             # Print every word, without a trailing newline

对于 Python 3,您需要稍微更改语法:

filename = 'test.txt'
with open(filename, 'r') as data:
    for line in data: 
        for word in line.strip().split():
            if word == 'ape':
                print()
            print(word, end=' ')
于 2013-08-20T14:36:11.967 回答
1

test.txt 文件类似于:

ape bear cat dog ape elephant frog giraffe ape horse iguana jaguar

我希望屏幕上的最终结果如下所示:

ape bear cat dog
ape elephant frog giraffe
ape horse iguana jaguar

因此,您希望每次出现的 'ape' 都位于一行的开头。

到目前为止我的代码:

file = "test.txt"
read_file = open(file, "r")
with read_file as data:

把这两个分开是没有意义的。如果with文件处理完毕,则将其关闭并且必须open()再次编辑。

所以就这样做

with open(file, "r") as data:

顺便说一句,在您的代码中,read_file并且data是相同的。

    read_file.read()

因此,您将整个文件读入内存并丢弃结果。

    print(data)

打印文件对象。

    word = "ape"

分配...

    for word in data:

...并立即再次丢弃它。

        data.split()

拆分数据并丢弃结果。

        print(data)

再次打印文件对象。

但是,当您阅读了整个文件时,for循环可能根本没有运行。

改进:

filename = "test.txt" # file is a builtin function
hotword = "ape"
with open(filename, "r") as read_file:
    for line in read_file:
        parts = line.split(hotword)
        if not parts[0]: # starts with the hotword, so 1st part is empty
            del parts[0]
        print ("\n" + ape).join(parts)

我将文件设为变量,因为我打算在脚本中多次使用它。

对于名称它是可以的,但是打开的文件不能被回收,因为with它关闭它。

当我测试代码时,for循环并没有在一个循环后停止。

当然?它打印了什么?

于 2013-08-20T14:48:17.307 回答
0
import re

file = "test.txt"
for line in open(file, 'r'):
    if(re.search('ape', line )):
        print(line)
于 2013-08-20T14:25:08.113 回答
0

您可以使用re.sub转义不在行首的任何单词,并在其前面放置一个换行符,因此您可以使用以下代码。

请注意,这会查找整个单词- 例如,grape不会匹配ape(与str.replace提供的解决方案不同):

import re

word = 'ape'
with open('yourfile') as fin:
    line = next(fin, '')
    print(re.sub(r'[^\b]({0}\s+)'.format(re.escape(word)), r'\n\1', line))
于 2013-08-20T15:00:40.303 回答