1 votos

Crear una expresión SQL y escribirla/leerla en/desde un archivo

Estoy trabajando en una forma de tomar el número de proyectos que están marcados como activos en una hoja de cálculo y ponerlo en una expresión SQL que pueda usar para seleccionar. Hasta ahora tengo esto

dirname = os.path.dirname(__file__)
gdbname = 'G:\\GIS\\General Maps\\AltumProjects\\AltumProjects.gdb'
env.workspace = gdbname
env.overwriteOutput = True
Riv = gdbname + '\\RivParcels'
df = pd.read_csv(dirname + '/ActiveProjects.csv')
newdf = df.loc[df['Status'] == 'Active', 'Project'].reset_index()
print(newdf)
Proj = np.array(newdf['Project'])
with open("Output.txt", "w") as text_file:
    print(f"\"Project IN ({Proj})\"", file=text_file)
with fileinput.FileInput("Output.txt", inplace=True, backup='.bak') as file:
    for line in file:
        print(line.replace("' ", "', "), end='')
with fileinput.FileInput("Output.txt", inplace=True, backup='.bak') as file:
    for line in file:
        print(line.replace("[", ""), end='')
with fileinput.FileInput("Output.txt", inplace=True, backup='.bak') as file:
    for line in file:
        print(line.replace("]", ""), end='')
expr = open('./Output.txt').readline()

Que crea un archivo de texto que es:

"Project IN ('C1335', 'C1410', 'C1237')"

Todo esto funciona bien pero cuando lo añado a SelectLayerByAttribute:

Projects = arcpy.MakeFeatureLayer_management('Projects', 'Projects.lyr')
Env = arcpy.SelectLayerByAttribute_management(Projects, "NEW_SELECTION", expr)
arcpy.CopyFeatures_management(Env, gdbname + '\\ActiveEnvProjects')
EnvProjects = gdbname + '\\ActiveEnvProjects'
SelectEnv = arcpy.SelectLayerByLocation_management(Riv, 'COMPLETELY_CONTAINS', EnvProjects, 0, 'NEW_SELECTION')
arcpy.CopyFeatures_management(SelectEnv, gdbname + '\\EnvProjectParcels')
print("Environmental Projects Done")

Lo entiendo:

ERROR 000358: Expresión no válida

Si añado esto manualmente como una cadena funciona bien pero no consigo que funcione así. ¿Hay algo en la forma en que estoy escribiendo mal la expresión?

1voto

Son of a Beach Puntos 184

Es necesario eliminar las comillas dobles en el archivo. O bien no las creas en el archivo de texto en primer lugar (mejor) o bien las eliminas de la variable cuando la vuelvas a leer usando replace() :

expr = open('./Output.txt').readline().replace('"', '')

Es decir, su expr en/desde el archivo debe ser:

Project IN ('C1335', 'C1410', 'C1237')

NO:

"Project IN ('C1335', 'C1410', 'C1237')"

Sólo es necesario utilizar las comillas dobles si se asigna a la variable como un literal de cadena dentro del código.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X