Je suis nouveau à Python et je me débats avec quelque chose de assez basique.
Qu'est-ce que j'essaie de faire: EM> P> J'ai un fichier texte composé de plusieurs lignes. Je veux que le numéro d'index [-3] soit multiplié par 2. P> Cependant, je veux seulement que Python multiplie l'index [-3] de toutes les lignes si strong> Numéro d'index [ 6] est égal à 1. P> si le numéro d'index [6] de ma ligne est 0, je ne veux pas multiplier le numéro par 2. Je veux juste que la ligne reste dans le fichier texte, complètement inchangé. P> Voici le problème: em> p> Si j'utilise la déclaration "si", il multiplie parfaitement le numéro d'index [-3] si mon aligné. Exemple d'une ligne multipliée dans laquelle le 6ème index est 1, de sorte que Python est autorisé à multiplier par 2: p> ID d'identifiant FLBO 'limite' st 0 ty 1 fort> q_ dw 0 flbbo id 'limite' st 0 ty Cependant, Si Python voit le numéro d'indice [6] n'est pas 1, il saute juste la ligne. Ce n'est pas ce que je veux, car de cette façon je perds mes données. Avant de démarrer mon script, mon fichier texte a 10 lignes. Le fichier résultant a 9 lignes. Donc, il est perdu une ligne. Exemple ": P> FLBO ID 'LIMITELLE' ST 0 TY rien. La ligne est partie. p> ma question: EM> p> Comment puis-je obtenir Python "N'oubliez pas" les lignes pour lesquelles la déclaration IF est faux? p> J'ai essayé d'utiliser la fonction Pass, mais le résultat est exactement le même. p> mon script / solution actuel: EM> P> J'ai résolu le problème de manière très laid, en multipliant la ligne où numéro d'index [6] = 0 par * 1. De cette façon, le nombre ne change pas. Mais ce n'est pas un moyen propre de programmation, je voudrais Pour être plus efficace. Le code: p> solution dans les commentaires. C'était un problème d'indentement.
Code qui fonctionne: p>
3 Réponses :
Vous devez voir ce que chaque ligne fait et non-indentement tout ce qui doit être effectué à toutes les lignes suivantes:
all_data = [] with open('C:\\directory1', 'r') as file_handler: for line in file_handler.readlines(): if line.strip(): each_line_data = line.split() if each_line_data[6] == '1': old_debiet = each_line_data[-3] new_debiet = float(old_debiet) * 2 each_line_data[-3] = str(new_debiet) new_each_line_data = ' '.join(each_line_data) all_data.append(new_each_line_data) print(new_each_line_data) with open('C:\\directory2', 'w') as file_handler: for item in all_data: file_handler.write("{}\n".format(item))
Vous pouvez réduire le code comme celui-ci:
all_data = [] with open('C:\\directory1', 'r') as file_handler: for line in file_handler.readlines(): if line.strip(): each_line_data = line.split() if each_line_data[6] == '1': multiplier = 2 elif each_line_data[6] == '0' multiplier = 1 else: # I'm not sure what you wish to do in this case multiplier = 1 old_debiet = each_line_data[-3] new_debiet = float(old_debiet) * 2 each_line_data[-3] = str(new_debiet) new_each_line_data = ' '.join(each_line_data) all_data.append(new_each_line_data) with open('C:\\directory2', 'w') as file_handler: for item in all_data: file_handler.write("{}\n".format(item))
Je vous suggère d'utiliser le module Vous devez également vous assurer de toujours enregistrer / sortir la ligne, quelles que soient les conditions. Comme @nathan a suggéré, il est logique de choisir de manière conditionnelle le multiplicateur, puis de traiter la ligne inconditionnellement. Em> p> La solution ci-dessous est Streaming em>, dans le sens qu'il n'accumule pas toutes les données en mémoire. Au lieu de cela, il traite chaque ligne et l'écrit, de sorte que l'utilisation de la mémoire soit constante (au lieu de O (n)). P> csv code> dans la bibliothèque standard.
FLBO id 'Boundary' st 0 ty 1 q_ dw 0 0.2 0 flbo
FLBO id 'Boundary' st 0 ty 1 q_ dw 0 0.4 0 flbo
FLBO id 'Boundary' st 0 ty 0 q_ dw 0 8.0 0 flbo
Tout comme une suggestion, j'utiliserais la déclaration IF uniquement pour choisir le multiplicateur, de cette façon de ne pas avoir à dupliquer tout le code.
Pouvez-vous ajouter un exemple de votre fichier, y compris 0 et 1 exemple