【问题标题】:Removing top empty line when writing a text file Python编写文本文件Python时删除顶部空行
【发布时间】:2015-11-24 12:17:51
【问题描述】:

我一直在尝试编写一个 fasta 解析器,它将一个 fasta 文本文件 (DNA) 作为输入并输出一个 AA 序列,我只使用 biopython SeqIO 模块来解析输入的 fasta 文件。

我得到了我想要的输出,但问题是每当我运行代码时,我的输出 fasta 文件顶部都会出现空白,我真的想删除它。

我一直在网上搜索,但到目前为止没有什么对我有用。

下面是我目前的代码。

from Bio import SeqIO
CONST_CODON = {'ttt': 'F', 'tct': 'S', 'tat': 'Y', 'tgt': 'C',
               'ttc': 'F', 'tcc': 'S', 'tac': 'Y', 'tgc': 'C',
               'tta': 'L', 'tca': 'S', 'taa': '*', 'tga': '*',
               'ttg': 'L', 'tcg': 'S', 'tag': '*', 'tgg': 'W',
               'ctt': 'L', 'cct': 'P', 'cat': 'H', 'cgt': 'R',
               'ctc': 'L', 'ccc': 'P', 'cac': 'H', 'cgc': 'R',
               'cta': 'L', 'cca': 'P', 'caa': 'Q', 'cga': 'R',
               'ctg': 'L', 'ccg': 'P', 'cag': 'Q', 'cgg': 'R',
               'att': 'I', 'act': 'T', 'aat': 'N', 'agt': 'S',
               'atc': 'I', 'acc': 'T', 'aac': 'N', 'agc': 'S',
               'ata': 'I', 'aca': 'T', 'aaa': 'K', 'aga': 'R',
               'atg': 'M', 'acg': 'T', 'aag': 'K', 'agg': 'R',
               'gtt': 'V', 'gct': 'A', 'gat': 'D', 'ggt': 'G',
               'gtc': 'V', 'gcc': 'A', 'gac': 'D', 'ggc': 'G',
               'gta': 'V', 'gca': 'A', 'gaa': 'E', 'gga': 'G',
               'gtg': 'V', 'gcg': 'A', 'gag': 'E', 'ggg': 'G'
               }

def DNA2Prot(f1, f2="translated_fasta.txt"):
    with open(f1, 'r') as fin, open(f2, 'w') as fout:
        for seq_record in SeqIO.parse(f1,'fasta'):
            sequence = seq_record.seq
            sequence = sequence.lower()
            fout.write('\n'+seq_record.description)
            fout.write('\n')
            for i in range(0,len(sequence),3):
                if sequence[i:i+3] in CONST_CODON:
                    amino_acid = CONST_CODON[str(sequence[i:i+3])]
                    fout.write(amino_acid)



if __name__ == "__main__":
    test = DNA2Prot('test_fasta.txt')
    print test

我当前的输出如下所示。

-----------------blank space--------------
BCB2141
IG*R*SRRESLYSD
BCA2111
MA*SRVEL*GTASSCRRAVEPI*EP
BCA2112
IEPRWVWPV*SPIEPIEIESR*SLRDPRCDAD

我想要的输出是:

BCB2141
IG*R*SRRESLYSD
BCA2111
MA*SRVEL*GTASSCRRAVEPI*EP
BCA2112
IEPRWVWPV*SPIEPIEIESR*SLRDPRCDAD

【问题讨论】:

  • fout.write('\n'+seq_record.description) 是空行的原因。第一行跳过\n。或者,构建行内容并使用str.join。或者,将所有文件内容(如果可能)存储到一个变量中,然后在写入文件之前使用str.strip
  • @mshsayem ,我知道,但我需要那些将 fasta 标头与不同行中的 fasta 序列分开
  • 是的,那是因为您在第一句话中的“空格”中给出了通过在打印消息前写入'\n'来给出............删除它并完成...... ....在该语句结束后写下空格.....n c wat 可能会告诉你更多\n行为
  • @CodeMan ,删除它时,我的 fasta 标头和氨基酸序列将在同一行....

标签: python


【解决方案1】:

你从一个空行开始,所以它打印一个空行。如果您想要一个空行作为 分隔符,请将其包含在末尾:

fout.write(seq_record.description + '\n') # no more leading newline
# fout.write('\n') # moved to above
for i in range(0,len(sequence),3):
    if sequence[i:i+3] in CONST_CODON:
        amino_acid = CONST_CODON[str(sequence[i:i+3])]
        fout.write(amino_acid)
fout.write('\n')

请注意,这会导致最后出现一个空行,这可能对您来说更容易接受。另一种方法是要求您知道何时到达最后一个条目,然后不要在其后添加换行符。

【讨论】:

    【解决方案2】:

    罪魁祸首是这条线: fout.write('\n'+seq_record.description)

    这将为每个序列记录描述行添加一个换行符,包括第一个。一种解决方案是更改为

    fout.write(seq_record.description)
    

    然后在内部 for 循环之后添加fout.write('\n')。当然这会让你的文件以换行符结束,但是that's POSIX standard anyways.

    【讨论】:

      猜你喜欢
      • 2021-02-18
      • 1970-01-01
      • 2013-08-25
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      相关资源
      最近更新 更多