Python: 将文件中特定行放入列表

0 投票
5 回答
4678 浏览
提问于 2025-04-16 15:54

你好,

我遇到了一个问题:

有一个文件,结构如下:

'>some cookies  
chocolatejelly  
peanutbuttermacadamia  
doublecoconutapple  
'>some icecream  
cherryvanillaamaretto  
peanuthaselnuttiramisu  
bananacoffee  
'>some other stuff  
letsseewhatfancythings  
wegotinhere  

目标:把每一行包含'>'之后的所有内容放进一个列表,作为一个完整的字符串

代码:

def parseSequenceIntoDictionary(filename):
    lis=[]
    seq=''
    with open(filename, 'r') as fp:
        for line in fp:
            if('>' not in line):
                seq+=line.rstrip()
            elif('>' in line):
                lis.append(seq)
                seq=''
        lis.remove('')
        return lis

这个函数会逐行读取文件,如果某一行没有'>',它就把后面的所有行连接起来,并去掉换行符'\n'。如果遇到'>',它会把之前连接的字符串自动添加到列表中,然后清空字符串'seq',准备连接下一段内容。

问题是:

以一个输入文件为例,它只把'一些饼干'和'一些冰淇淋'的内容放进列表里,而没有把'一些其他东西'的内容放进去。所以我们得到的结果是:

[chocolatejelly 
peanutbuttermacadamia 
doublecoconutapple, cherryvanillaamaretto 
peanuthaselnuttiramisu 
bananacoffee] but not  

[chocolatejelly 
peanutbuttermacadamia 
doublecoconutapple, cherryvanillaamaretto 
peanuthaselnuttiramisu 
bananacoffee, letsseewhatfancythings 
wegotinhere]  

这里面有什么错误的思路吗?在循环中可能有逻辑错误,但我不知道在哪里。

提前感谢任何提示!

5 个回答

1

在编程中,有时候我们需要处理一些数据,这些数据可能是从用户那里输入的,或者是从其他地方获取的。为了让程序能够理解这些数据,我们通常会把它们转换成一种特定的格式。这个过程叫做“数据转换”。

比如说,如果你有一个数字字符串“123”,但是程序需要的是数字类型的123,那么你就需要把这个字符串转换成数字。这样,程序才能进行数学运算。

在不同的编程语言中,数据转换的方法可能会有所不同。有些语言提供了简单的函数来完成这个任务,而有些则需要你手动进行转换。

总之,数据转换是编程中一个非常重要的概念,理解它能帮助你更好地处理和使用数据。

my_list = []
with open('file_in.txt') as f:
    for line in f:
        if line.startswith("'>"):
            my_list.append(line.strip().split("'>")[1])

print my_list  #['some cookies', 'some icecream', 'some other stuff']
1

你只有在找到一个以 > 开头的新行时,才会把 seq 加到结果列表里。所以到最后,你的 seq 里会有一些数据(就是你缺少的那些),但你没有把它加到结果列表中。因此,在你的循环结束后,如果 seq 里有数据,就把它加上去,这样就没问题了。

2

问题在于,你只在遇到包含 '>' 的行时才保存当前的部分 seq。当文件结束时,你的这个部分仍然是打开的状态,但你并没有把它保存下来。

修复你程序的最简单方法是这样的:

def parseSequenceIntoDictionary(filename):
    lis=[]
    seq=''
    with open(filename, 'r') as fp:
        for line in fp:
            if('>' not in line):
                seq+=line.rstrip()
            elif('>' in line):
                lis.append(seq)
                seq=''
        # the file ended
        lis.append(seq) # store the last section
        lis.remove('')
        return lis

顺便提一下,你应该使用 if line.startswith("'>"): 来防止可能出现的错误。

撰写回答