2016-10-07 1 views
0

j'ai un fichier txt et je veux créer script python avec sys.argv ou argparse ou un autre emballage pour définir certaines variables dans le fichier txt et je prends un résultat.définir des variables dans le fichier txt en utilisant un script python

je veux mettre à jour les variables dans le fichier texte basé sur des arguments passés au script python

fichier

txt peut-être comme ceci:

input number 1= %var1% 
input number 2= %var2% 
result = %vresult(var1-var2)% 

doit var1, var2 définir par l'utilisateur avec une entrée dans le script python et je prends résultat (var1-var2 par ex)

Je peux le faire facilement mais je ne sais pas comment connecter les arguments du script python à txt.

comment puis-je écrire un script python pour mettre à jour les variables dynamiques dans le fichier txt?

Je ne veux pas avec remplacer je chose si les arguments est le meilleur.

+0

Voulez-vous lire les variables du fichier txt avec un script python? Ou mettre à jour les variables dans le fichier texte en fonction des arguments passés au script python? J'essaye de te suivre mais je ne comprends pas. – intrepidhero

+0

je veux mettre à jour les variables dans le fichier texte basé sur les arguments passés au script python –

Répondre

0

Il y a certainement une meilleure façon de le faire, mais cela semblait être un problème intéressant, alors j'ai décidé de l'essayer. J'ai défini un fichier texte avec les noms de variables désignés comme tels:

newfile.txt:

x = 1 
y = 2 
z = 3 

En lisant une ligne à un type et conforme au format d'entrée « var = valeur », vous pouvez analyser le fichier texte pour la variable correcte, puis réécrire le fichier avec la nouvelle valeur.

import fnmatch 


var2change = "z = 17" 
identifier = var2change.split('=')[0] # Get variable name 

# Read file 
file = open('newfile.txt', 'r') 
fileLines = file.read() 
fileLines = fileLines.splitlines() 

for lineNum,var in enumerate(fileLines): 
    if fnmatch.fnmatch(str(var),''.join([identifier,'*'])): break # Found variable to change 

file.close() 

file = open("newfile.txt", "w") 
for ln, data in enumerate(fileLines): 
    if ln == lineNum: 
     lineToWrite = ''.join([var2change, '\n']) 
    else: 
     lineToWrite = ''.join([data, '\n']) 

    file.write(lineToWrite) 

file.close() 

Cela récrire le fichier à lire:

newfile.txt:

x = 1 
y = 2 
z = 17 
1

Ceci est une manière différente en utilisant regex et un dictionnaire, et en prenant d'entrée à l'aide sys.argv :

import sys,re 
v1 = sys.argv[1] 
v2 = sys.argv[2] 

with open('file.txt','r') as f: 
    content = f.read() 

repl = {'var1':v1, 'var2':v2} 

repl_pattern = re.compile(r'(' + '|'.join(repl.keys()) + r')') 
final_data = repl_pattern.sub(lambda x: repl[x.group()], content) 

with open('file.txt','w') as new: 
    new.write(final_data) 

résultats:

Le file.txt avait d'abord le contenu suivant:

input number 1= var1 
input number 2= var2 
result = vresult(var1-var2) 

et après l'exécution du code ci-dessus (avec: sys.argv[1]=2 et sys.argv[2] = 3) le fichier modifié:

input number 1= 3 
input number 2= 2 
result = vresult(3-2) 

Si vous voulez result = 1 au lieu de result = vresult(3-2) puis ajouter ce code:

result = str(int(v1)-int(v2)) 
key3 = 'vresult('+v1+'-'+v2+')' 
final_data = final_data.replace(key3,result) 

juste avant le with open('file.txt','w') as new: ....

+0

je suis votre code mais montrez-moi 'IndexError: liste index hors de portée' dans la ligne 2, v1 = sys.argv [1] et je change à v1 = sys.argv [1] = 2 encore me montrer cette erreur, pourquoi? je suis l'utilisateur python 2.7 –

+0

@ChrisPapas vous ne devez pas/ne doit pas donner des valeurs à 'sys.argv' en interne, si vous nommez le script par exemple test.py, essayez de l'exécuter comme: 'python test.py 3 2' et assurez-vous de changer le nom de fichier de fichier.txt en n'importe quel nom de fichier que vous utilisez. J'utilise aussi python 2.7 et je n'ai eu aucun problème ... – coder

+0

de la ligne cmd oui, mais les progrès que je veux et doivent exécuter dans le script pas la ligne cmd. –