Tengo este código para interpolar entre los valores y devolver el valor Z para X e Y específicos. Estoy intentando abrir otro archivo (world.txt) y pegar el valor con un nombre específico Nz.

La forma en que se organiza el archivo es

Nx
5
Ny
0.1
Nz
0.8

Pero lo que obtengo es givemeZ(0.5,0.04) en lugar del valor 0.78

¿Podría sugerir algunas ideas sobre cómo solucionarlo?

import numpy as np
from scipy import interpolate
from scipy.interpolate import griddata
import itertools
from scipy.optimize import curve_fit

xx= 0.15, 0.3, 0.45, 0.5, 0.55
yy= 0.01, 0.02, 0.03, 0.04, 0.05
zz= 0.75, 0.76, 0.77, 0.78, 0.79

tck = interpolate.bisplrep(xx, yy, zz, s=0)    
def givemeZ(X,Y):
    return interpolate.bisplev(X,Y,tck)
## to replace the value 
with open('world.txt', 'r') as file :
  filedata = file.read()
# Replace the target string
filedata = filedata.replace('Nz', 'givemeZ(0.5,0.01)')
# Write the file out again
with open('world.txt', 'w') as file:
  file.write(filedata)
1
Zena 11 nov. 2017 a las 21:47

2 respuestas

La mejor respuesta

Bueno sí. Pasa filedata.replace el literal de cadena 'givemeZ(0.5,0.01)'. Debe pasarle el valor real, convertido a una cadena, como

filedata = filedata.replace('Nz', str(givemeZ(0.5,0.01)))

Dependiendo de los detalles, es posible que pueda escapar sin la llamada a str(); no estoy seguro de si replace manejará sin problemas los argumentos que no sean str que se puedan convertir a {{ X3}}. Sin embargo, hacer la conversión usted mismo explícitamente debería funcionar.


Para reemplazar la siguiente línea, necesita algo de lógica que se ejecute en un bucle; no creo que pueda hacerlo simplemente con replace. Podrías hacer algo como esto:

new_lines = []
previous_line = ''
with open('world.txt', mode = 'r') as f:
    for current_line in f:
        if previous_line == 'Nz':
            new_lines.append(str(givemeZ(0.5,0.01)))
        else:
            new_lines.append(current_line)
        previous_line = current_line

new_text = '\n'.join(new_lines)

A continuación, puede volver a escribir el nuevo texto en world.txt; tenga en cuenta que las operaciones que está haciendo aquí, incluso en su código original, no modifican el archivo real, solo la cadena de Python en la memoria.

2
Josh Karpel 11 nov. 2017 a las 19:42

Su código funciona como se esperaba, la línea

filedata = filedata.replace('Nz', 'givemeZ(0.5,0.01)')

Reemplaza la cadena Nz con la cadena givemeZ(0.5,0.01).

Quiere reemplazar Nz con el valor de retorno de givemeZ(0.5,0.01). Utilice lo siguiente:

filedata = filedata.replace('Nz', str(givemeZ(0.5, 0.01)))

Esto toma el valor de retorno de givemeZ() y convierte este valor en una cadena.

1
bastelflp 11 nov. 2017 a las 19:04