将文本文件的一部分放入列表中

1 投票
5 回答
2777 浏览
提问于 2025-04-17 12:52

我有一个文本文件,我需要把里面的某些部分提取出来放到一个列表里。

这个文件的内容大概是这样的:

blah blah
.........

item: A,B,C.....AA,BB,CC....

Other: ....

....

我只需要把“Item:”后面和“Other:”前面的部分提取出来,像A、B、C……AA、BB、CC……这些内容。

对于小文件来说,这个操作很简单,但问题是文件可能会很大,里面的项目也可能很多。用rfind和strip这些方法处理大文件时,效率会和处理小文件一样吗?从算法的角度来看,这样做是否高效?

那么,有什么高效的方法可以做到这一点呢?

5 个回答

0

关于效率的问题,逐行读取文件并进行比较的平均性能是 O(n),也就是说,处理的时间和文件的行数成正比。

下面是一个代码示例:

pattern = "item:"
with open("file.txt", 'r') as f:
    for line in f:
        if line.startswith(pattern):
            # You can do what you like with it; split it along whitespace or a character, then put it into a list.

你是在整个文件中顺序查找的,必须比较文件中的一些元素,才能找到你想要的那个元素。

你也可以选择建立一个搜索树。虽然建立这个树的成本是 O(n),但搜索时的时间复杂度是 O(logkn),这样整体的时间复杂度还是 O(n),这里的 k 是你列表中起始字符的数量。

0

虽然我通常很喜欢使用正则表达式,但我觉得在一个大文件中只出现一次的情况,用正则表达式反而会增加工作量,而且计算开销也太大了。所以,直接的方法(用Python写)可能更合适:

s = 'item:'
yourlist = next(line[len(s)+1:].split(',') for line in open("c:\zzz.txt") if line.startswith(s))

当然,这里假设'item:'这一行不会出现在其他不跟'other:'的行上,但如果'item:'只出现一次,并且是在行的开头,这个简单的生成器应该能满足你的需求。

2

我觉得没有必要使用 rfind()strip() 这两个函数。

看起来你只是想做这个:

start = 'item: '
end = 'Other: '
should_append = False
the_list = []
for line in open('file').readlines():
    if line.startswith(start):
        data = line[len(start):]
        the_list.append(data)
        should_append = True
    elif line.startswith(end):
        should_append = False
        break
    elif should_append:
        the_list.append(line)

print the_list

这样做不会把整个文件都放到内存里,只会存当前这一行和在开始和结束模式之间找到的行的列表。

撰写回答