Remplacer la chaîne de caractères dans une ligne spécifique à l'aide de python
Je suis en train d'écrire un script python pour remplacer les chaînes à partir d'un texte chaque fichier dans un répertoire avec une extension spécifique (.seq). Les chaînes remplacé doit être uniquement à partir de la deuxième ligne de chaque fichier, et la sortie est un nouveau sous-répertoire (appel propre) avec les mêmes noms de fichiers comme les fichiers d'origine, mais avec un *.propre suffixe. Le fichier de sortie contient exactement le même texte que l'original, mais avec les cordes remplacé. J'ai besoin de remplacer tous ces chaînes: 'K','Y','W','M','R','S' par 'N'.
C'est ce que j'ai trouvé après googler. C'est très salissant (2ème semaine de programmation), et il s'arrête à la copie des fichiers dans le répertoire propre, sans les remplacer quoi que ce soit. Je serais vraiment reconnaissant de toute aide.
Grâce avant de!
import os, shutil
os.mkdir('clean')
for file in os.listdir(os.getcwd()):
if file.find('.seq') != -1:
shutil.copy(file, 'clean')
os.chdir('clean')
for subdir, dirs, files in os.walk(os.getcwd()):
for file in files:
f = open(file, 'r')
for line in f.read():
if line.__contains__('>'): #indicator for the first line. the first line always starts with '>'. It's a FASTA file, if you've worked with dna/protein before.
pass
else:
line.replace('M', 'N')
line.replace('K', 'N')
line.replace('Y', 'N')
line.replace('W', 'N')
line.replace('R', 'N')
line.replace('S', 'N')
OriginalL'auteur bow | 2010-01-04
Vous devez vous connecter pour publier un commentaire.
quelques remarques:
string.replace
etre.sub
ne sont pas en place de sorte que vous devrait être de l'affectation de la valeur de retour de votre variable.glob.glob
est mieux pour la recherche des fichiers dans un répertoire correspondant à un modèle défini...with
déclaration prend soin de la fermeture du fichier de manière sûre. si vous ne voulez pas l'utiliser, vous devez utilisertry
finally
.*.clean
😉fileinput
module (qui jusqu'à aujourd'hui je ne sais pas)voici mon exemple:
espère que cela aide.
OriginalL'auteur João Portela
Vous devez remplacer
line.replace('M', 'N')
avecline=line.replace('M', 'N')
. remplacer renvoie une copie de la chaîne d'origine avec les sous-chaînes remplacé.Encore mieux (OMI) est d'utiliser ré.
OriginalL'auteur MAK
Voici quelques conseils généraux:
Ne pas utiliser
find
pour la vérification de l'extension de fichier (par exemple, ce serait également correspondre à "file1.seqdata.xls
"). Au moins utiliserfile.endswith('seq')
, ou, mieux encore,os.path.splitext(file)[1]
En fait, ne le faites pas tout à fait. C'est ce que vous voulez:
Ne copiez pas les fichiers, il est beaucoup plus facile à utiliser qu'une seule boucle:
Ne pas utiliser
line.__contains__('>')
. Ce que vous entendez est(qui feront appel
__contains__
en interne). Mais en fait, vous voulez savoir si la ligne commence avec un `">", pas si il y a un quelque part à l'intérieur de la ligne, que ce soit au début ou pas. Sorte que le meilleur moyen serait celui-ci:Je ne suis pas familier avec le type de fichier; si le
">"
case est vraiment juste pour la détermination de la première ligne, il y a de meilleures façons de le faire.Vous n'avez pas besoin de la
if
bloc (il vous suffit depass
). C'est plus propre d'écrireau lieu de
Amusez-vous à apprendre Python!
OriginalL'auteur balpha
vous devez affecter le résultat de la substitution de retour à la "ligne" variable
vous pouvez également utiliser le module fileinput en place pour modifier
changer de place=0 à la place=1 dans l'édition de vos fichiers.
OriginalL'auteur ghostdog74
ligne.remplacer n'est pas un mutateur, il quitte la chaîne d'origine inchangé et renvoie une nouvelle chaîne avec les remplacements effectués. Vous aurez besoin de modifier votre code pour
line = line.replace('R', 'N')
, etc.Je pense que vous aussi souhaitez ajouter un
break
déclaration à la fin de votre clause else, de sorte que vous n'avez pas à effectuer une itération sur l'ensemble du fichier, mais arrêter après l'avoir traité de la ligne 2.Enfin, vous aurez besoin d'écrire le fichier contenant vos modifications. Jusqu'à présent, vous êtes juste en train de lire le fichier et la mise à jour de la ligne de votre programme variable "ligne". Vous devez créer un fichier de sortie, à laquelle vous allez écrire les lignes modifiées.
OriginalL'auteur PaulMcG