如何使用Python中的文件处理在文本文件中写入特定部分?

niknxzdl  于 2023-05-02  发布在  Python
关注(0)|答案(5)|浏览(220)

我正在处理一个项目,想在一个文本文件中打印多行。这就是我为此目的使用的方法。

def story_part(file_path,initial_index,final_index):
    line_number = list(range((initial_index -1) ,final_index ))
    mylines = []

    with open(file_path) as f:
        for i , line in enumerate(f):
            if i in line_number:

                mylines.append(line.rstrip())
            elif i > final_index:
                break
    for content in mylines:
        print(content)

你能输入更有效的代码吗?
我试图从文本文件中打印指定的部分。我已经搜索了几个网站,没有找到任何有用的东西。
经过一段时间的摸索,我想出了这个功能。这是正确的方法,还是你可以帮助它改进?

qlckcl4x

qlckcl4x1#

您可能可以在代码中进行的一个优化(无需更改太多)是将line_number设置为set,以便索引查找变为常量。

i in [1 2 3] # O(n) 
i in {1 2 3} # O(1)

目前的答案是完美的。但是,read()readlines()splitlines()将整个数据加载到内存中。当文件大小很大时,这可能不是非常可伸缩的。
您可以使用itertools作为迭代器读取文件。

from itertools import islice
def story_part(file_path,initial_index,final_index):

    with open(file_path, "r") as f:
        # islice the file iterator from start index to end index. (You can also pass a step to islice)
        # map your rstrip to each line that is read.
        # list call is not necessary here if you are looping over the data within the scope of `with`. To use the data elsewhere, you will have to realize it with the list call.
        mylines = list(map(str.rstrip, islice(f, initial_index-1, final_index)))
    for content in mylines:
        print(content)

这种方式文件是只读的,直到final_index,只有所需的行被加载到内存中。(注意,initial_index之前的所有文件行都将被读取,但被忽略。)

7jmck4yq

7jmck4yq2#

我建议看看.readlines方法和切片,这可以让你输出的行范围更简洁,比如说如果我需要file.txt的第5,6,7,8,9,10行,我可以按照下面的方式来做

with open("file.txt") as f:
    lines = f.readlines()[4:10]
    print(''.join(lines), end='')

.readlines()返回包含尾随换行符的行列表,[4:10]是所谓的 slicing,它允许您获取列表的切片。然后我们使用空字符串连接行(因为它们已经有了换行符),并将end设置为空字符串(同样,由于换行符已经存在)。

uwopmtnx

uwopmtnx3#

你不需要for循环。你只能通过python列表的切片特性来完成这项工作。

def story_part(file_path, initial_index, final_index):
    with open(file_path) as f:
        file_data = f.read().splitlines()

    mylines = file_data[initial_index-1:final_index]

    for content in mylines:
        print(content)

在上面的函数中,首先我读取数据并将其保存在一个名为file_data的变量中,该变量是文件中所有行的列表。请注意,使用.read().splitlines()比使用.readlines()更好,因为它省略了每行的\n字符。然后,file_data[initial_index-1:final_index]代码只选择所需的索引。之后,for循环打印数据(包含这一行只是因为代码中有它。这是不必要的。)
这段代码没有额外的for循环和if语句。
你也可以在一个更小的情况下编写上面的代码,像这样:

def story_part(file_path, initial_index, final_index):
    with open(file_path) as f:
        for content in f.read().splitlines()[initial_index-1:final_index]:
            print(content)

这是完全相同的代码,但没有额外的变量和代码分离。

7uzetpgm

7uzetpgm4#

它可以在可读性方面有所改进,但你仍然需要遍历整个文件:

def story_part(file_path, initial_index, final_index):
    mylines = []

    with open(file_path) as f:
        for i, line in enumerate(f, start=1):
            if initial_index <= i <= final_index:
                mylines.append(line.rstrip())
            elif i > final_index:
                break

    for content in mylines:
        print(content)

请注意,在阅读大文件时应避免使用f.readlines(),因为它会将整个文件存储在内存中。

bnl4lu3b

bnl4lu3b5#

def print_lines_file(file_path: str,initial_index: int = 0,final_index:int = 1):
    with open(file_path) as f:
        for i in f.readlines()[initial_index:final_index]:
            print(i)

相关问题