通过根据一组字符将文件拆分为列表项,将文本文件读入python

通过根据一组字符将文件拆分为列表项,将文本文件读入python,python,list,readfile,splice,dna-sequence,Python,List,Readfile,Splice,Dna Sequence,我有一个包含以下内容的纯文本文件: @M00964: XXXXX YYY + ZZZZ @M00964: XXXXX YYY + ZZZZ @M00964: XXXXX YYY + ZZZZ 我想把它读到一个列表中,根据ID代码@M00964将其分为几个项目,即: ['@M00964: XXXXX YYY + ZZZZ' '@M00964: XXXXX YYY + ZZZZ' '@M00964: XXXXX YYY + ZZZZ'] 我试过使用 in_file = open(fileNa

我有一个包含以下内容的纯文本文件:

@M00964: XXXXX
YYY
+
ZZZZ 
@M00964: XXXXX
YYY
+
ZZZZ
@M00964: XXXXX
YYY
+
ZZZZ
我想把它读到一个列表中,根据ID代码
@M00964
将其分为几个项目,即:

['@M00964: XXXXX
YYY
+
ZZZZ' 
'@M00964: XXXXX
YYY
+
ZZZZ'
'@M00964: XXXXX
YYY
+
ZZZZ']
我试过使用

in_file = open(fileName,"r")
sequences = in_file.read().split('@M00964')[1:]
in_file.close()
但这会删除ID序列
@M00964
。有没有办法保留这个ID序列

另外一个问题是,是否有办法在列表中保留空白(而不是使用/n符号)


我的总体目标是读入这组项,以前2项为例,将它们写回一个文本文件,保持所有原始格式

只需在@符号上拆分即可:

with open(fileName,"r") as in_file:
    sequences = in_file.read().replace("@","###@").split('###')

针对您的示例,您不能只执行以下操作:

in_file = open(fileName, 'r')
file = in_file.readlines()

new_list = [''.join(file[i*4:(i+1)*4]) for i in range(int(len(file)/4))]
list_no_n = [item.replace('\n','') for item in new_list]

print new_list
print list_no_n
[扩展表格]

new_list = []
for i in range(int(len(file)/4)): #Iterates through 1/4 of the length of the file lines.
                                  #This is because we will be dealing in groups of 4 lines
    new_list.append(''.join(file[i*4:(i+1)*4])) #Joins four lines together into a string and adds it to the new_list
[写入新文件]

write_list = ''.join(new_list).split('\n')
output_file = open(filename, 'w')
output_file.writelines(write_list)

如果您的文件很大,并且不想将整个内容保存在内存中,则可以使用以下帮助函数对单个记录进行迭代:

def chunk_records(filepath)
    with open(filepath, 'r') as f:
        record = []
        for line in f:
            # could use regex for more complicated matching
            if line.startswith('@M00964') and record:
                yield ''.join(record)
                record = []
            else:
                record.append(line)
        if record:
            yield ''.join(record)
像这样使用它

for record in chunk_records('/your/filename.txt'):
    ...
或者如果你想把整件事都记在记忆里:

records = list(chunk_records('/your/filename.txt'))

.read()
读取一行。尝试使用读取所有行的
.readlines()
,然后在
上拆分“\n”
您能否详细说明“在列表中保留空白(而不是有符号)”的含义?
\n
只是“换行符”的简写,即空白。项目看起来像什么?上面的示例列表只有一项。看起来像FASTQ,其中一条记录总是4行。如果您想要前2条记录,只需打印第一行
2*4
。@fredtantini Err,我想您需要检查一下。Read接受一个size参数,如果没有,则读取整个文件@M00946@Steven如果文件较大,Rumbalski的RAM效率更高。我选择了最简单的解决方案。嗨,对不起,我上个月才学会python,你能解释一下这段代码的实际功能吗?Thankyou@user3460300,代码将每四行分组,并将它们连接成一个字符串。然后,它将四行组成的组合并成一个列表。我将更新我的答案,以显示我正在做的事情的扩展形式。@user3460300,没问题。祝你好运@用户3460300,注意:我还创建了另一个名为
list\u no\n
的变量。这与
new\u list
相同,但不包含任何
\n
字符,因此可用于脚本内的数据处理。如果要将字符串写入另一个文件,可以使用原始的
新列表
字符串及其保留的
\n
字符,并保留其格式。当然,您可以选择只写入前两组数据,因为它是一个列表。因此,当我将前两组数据写回文本文件时,我如何才能保持文本文件的格式,而不是让所有数据都与/n字符对齐?此外,谢谢你,我已经设法让第一位工作完美!!文件中的换行符很重要,所以OP应该用
'\n'
而不是
'
.@Steven Rumbalski,谢谢你,我现在就来看看如何使用它。@rmartinjak你是说用'/n'替换上面代码中的''?@martinjak:换行符从来没有被剥离过,所以不需要重新添加。当在文件中的行上迭代时,python会留下以结尾的行。哦,事实上,我完全忘记了这一点