Python: estoy luchando por eliminar este error de mi función cuando intento probar mi código con los parámetros.

CorePress2024-01-24  10

Estoy luchando por eliminar este error de mi función, cuando intento probar mi código con los parámetros enumerados a continuación en la sección "los errores que recibo". lista

¿Alguien puede ayudarme? He estado intentando corregir este error y no pude resolverlo.

He enumerado a continuación:

El archivo number.txt en el que tenemos que trabajar para este código

los errores que estoy recibiendo

mi código

la prueba de muestra

entonces mi pregunta es clara de entender.

Trabaja con el archivo clientes.txt en esta pregunta.

12345,Tom,Black,300.00,1998-01-30
23456,Alice,Smith,1200.50,1998-02-20
14567,Jane,White,900.00,1998-07-01
43564,Weilin,Zhao,450.25,1998-01-03
45432,Bina,Mehta,278.95,1998-03-21

los errores que estoy recibiendo

Test various parameters: '['customers file variable', '12345']'
ERROR:
Expected: ['12345', 'Tom', 'Black', '300.00', '1998-01-30']
Test various parameters: '['customers file variable', '45432']'
ERROR:
Expected: ['45432', 'Bina', 'Mehta', '278.95', '1998-03-21']
def customer_by_id(fh, id_number):
    """
    

------------------------------------

------------------- Find the record for a given ID in a sequential file. Use: result = customer_by_id(fh, id_number)

------------------------------------

------------------- Parameters: fh - file to search (file handle - already open for reading) id_number - the id_number to match (str) Returns: result - the record with id_number if it exists, an empty list otherwise (list)

------------------------------------

------------------- """ num = fh.read().split("\id_number") if int(id_number) < len(num): result = int(num[id_number]).strip().split(",") else: result = [] print(result)

Pruebas de muestra:

Find customer by id_number
Enter an ID: 23456
['23456', 'Alice', 'Smith', '1200.50', '1998-02-20']
----
Find customer by id_number
Enter an ID: 99999
[]

Te recomendaría que eches un vistazo al módulo csv. Más información aquí: docs.python.org/3/library/csv.html

-tobías

27/03/2021 a las 21:12

activado si id_number < len(num) la variable id_number parece ser una cadena, no un número, prueba con algo como int(id_number ) en su lugar.

- Iván

27/03/2021 a las 21:14

Desafortunadamente, no podemos usar CSV porque todavía no hemos llegado allí en el curso.

- sara miller

27/03/2021 a las 21:15

tenga en cuenta que el operador < funciona para cadenas, pero no compara una cadena con una variable numérica

- Iván

27/03/2021 a las 21:15

He actualizado mi código con tu request y obtuve diferentes errores. Agregué los nuevos errores a mi pregunta para que puedas verlos claramente.

- sara miller

27/03/2021 a las 21:21



------------------------------------

Primero, en su código, .split("\id_number") está causando un problema. Busca la cadena \id_number en el archivo de texto, que no existe. Por lo tanto esto da como resultado una lista con un solo elemento, siendo este último el texto completo.

Y luego, para ser franco, la cláusula if no tiene sentido. El lado izquierdo es, por ejemplo, el número entero 12345 que representa la identificación del cliente. El lado derecho, por otro lado, es el número de elementos de la lista, es decir, 1. SintácticoTotalmente correcto, pero semánticamente incorrecto.

Entonces, cuando miras esto, el LHS es casi siempre un número grande, digamos 12345, mientras que el RHS es 1. Por lo tanto, esta cláusula if nunca se ejecutará. En cambio, se alcanza la parte else, lo que da como resultado una lista vacía.

Aquí está mi sugerencia sin usar csv.

def customer_by_id(fh, id_number):
    records = f.read().splitlines()
    records = [record.split(",") for record in records]
    for record in records:
        if record[0] == id_number:
            return record
    return []

with open("customers.txt", "r") as f:
    print(customer_by_id(f, "23456"))

En la primera línea de la definición de función, registros es una lista que contiene cada línea de clientes.txt. Así quedaría

['23456,Alice,Smith,1200.50,1998-02-20', '14567,Jane,White,900.00,1998-07-01', ...]

Tenga en cuenta que cada elemento de la lista es solo una cadena.

La segunda línea ahora convierte cada cadena en una lista usando split(). Ahora los registros son una lista de listas, es decir, cada elemento de los registros es nuevamente una lista. Ahora parece

[['23456', 'Alice', 'Smith', '1200.50', '1998-02-20'], ['14567', 'Jane', 'White', '900.00', '1998-07-01'], ... ]

A continuación, el bucle for itera sobre estas sublistas y compara el primer elemento (de la sublista).t) al número_id. Si coinciden, devuelve la sublista (finalizando la función). De lo contrario, continúe la iteración. Cuando ninguno de ellos coincide con id_number, se alcanza el retorno [].



------------------------------------

Si entiendo tu pregunta correctamente, deseas imprimir la lista de información:

def customer_by_id(fh, id_number):
    
    with open(fh, "r") as file:
        for line in file.readlines():
            if line.startswith(str(id_number)):
                customer = line.strip().split(",")
    
    if not customer:
        customer = []

    return customer


while True:
    print("Find customer by id_number")
    id = input("Enter an ID: ")
    print(customer_by_id("customers.txt", id))
    print("---")

Esto se ejecutará hasta que cierre el programa o utilice KeyboardInterrupt.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare