web-dev-qa-db-fra.com

Comment enregistrer la sortie de python comme tsv

J'utilise un package biopython et je voudrais enregistrer le résultat comme un fichier tsv. Cette sortie de l'impression vers tsv.

for record in SeqIO.parse("/home/fil/Desktop/420_2_03_074.fastq", "fastq"):
    print ("%s %s %s" % (record.id,record.seq, record.format("qual")))

Je vous remercie.

12
Vonton

C'est assez simple, au lieu de l'imprimer, vous devez l'écrire dans un fichier.

with open("records.tsv", "w") as record_file:
    for record in SeqIO.parse("/home/fil/Desktop/420_2_03_074.fastq", "fastq"):
        record_file.write("%s %s %s\n" % (record.id,record.seq, record.format("qual")))

Et si vous souhaitez nommer les différentes colonnes du fichier, vous pouvez utiliser:

record_file.write("Record_Id    Record_Seq    Record_Qal\n")

Ainsi, le code complet peut ressembler à:

with open("records.tsv", "w") as record_file:
    record_file.write("Record_Id    Record_Seq    Record_Qal\n")
    for record in SeqIO.parse("/home/fil/Desktop/420_2_03_074.fastq", "fastq"):
        record_file.write(str(record.id)+"  "+str(record.seq)+"  "+ str(record.format("qual"))+"\n")
4
ZdaR

Ma solution préférée consiste à utiliser le module CSV . C'est un module standard, donc:

  • Quelqu'un d'autre a déjà fait le gros du travail.
  • Il vous permet de tirer parti de toutes les fonctionnalités du module CSV .
  • Vous pouvez être assez sûr qu'il fonctionnera comme prévu (pas toujours le cas lorsque je l'écris moi-même).
  • Vous n'aurez pas à réinventer la roue, que ce soit lorsque vous écrivez le fichier ou lorsque vous le relisez à l'autre extrémité (je ne connais pas votre format d'enregistrement, mais si l'un de vos enregistrements contient un TAB, CSV lui échappera correctement).
  • Il sera plus facile à prendre en charge lorsque la prochaine personne devra entrer pour mettre à jour le code 5 ans après avoir quitté l'entreprise.

L'extrait de code suivant devrait faire l'affaire pour vous:

#! /bin/env python3
import csv
with open('records.tsv', 'w') as tsvfile:
    writer = csv.writer(tsvfile, delimiter='\t', newline='\n')
    for record in SeqIO.parse("/home/fil/Desktop/420_2_03_074.fastq", "fastq"):
        writer.writerow([record.id, record.seq, record.format("qual")])

Notez que c'est pour Python 3.x. Si vous utilisez 2.x, les open et writer = ... sera légèrement différent.

19
Doug R.

Si vous souhaitez utiliser le .tsv pour étiqueter vos incorporations Word dans TensorBoard, utilisez l'extrait de code suivant. Il utilise le module CSV (voir réponse de Doug ).

# /bin/env python3
import csv

def save_vocabulary():
    label_file = "Word2context/labels.tsv"
    with open(label_file, 'w', encoding='utf8', newline='') as tsv_file:
        tsv_writer = csv.writer(tsv_file, delimiter='\t', lineterminator='\n')
        tsv_writer.writerow(["Word", "Count"])
        for Word, count in Word_count:
            tsv_writer.writerow([Word, count])

Word_count est une liste de tuples comme ceci:

[('the', 222594), ('to', 61479), ('in', 52540), ('of', 48064) ... ]
3
Domi W

L'extrait suivant:

from __future__ import print_function
with open("output.tsv", "w") as f:
  print ("%s\t%s\t%s" % ("asd", "sdf", "dfg"), file=f)
  print ("%s\t%s\t%s" % ("sdf", "dfg", "fgh"), file=f)

Donne un fichier output.tsv contenant

asd    sdf    dfg
sdf    dfg    fgh

Donc, dans votre cas:

from __future__ import print_function
with open("output.tsv", "w") as f:
  for record in SeqIO.parse("/home/fil/Desktop/420_2_03_074.fastq", "fastq"):
    print ("%s %s %s" % (record.id,record.seq, record.format("qual")), file=f)
1
EvenLisle

Je préfère utiliser join() dans ce type de code:

for record in SeqIO.parse("/home/fil/Desktop/420_2_03_074.fastq", "fastq"):
    print ( '\t'.join((str(record.id), str(record.seq), str(record.format("qual"))) )

Le caractère 'tabulation' est \t et la fonction de jointure prend les arguments (3) et les affiche avec un onglet entre les deux.

0
philshem