Entonces, tengo este archivo de texto que contiene esta información:

student_num1 student_name1 student_grade1
student_num2 student_name2 student_grade2
student_num3 student_name3 student_grade3

Lo que quiero hacer es tomar cada línea de este archivo de texto como una entrada de diccionario con este formato:

students = { student_num1: [student_name1, student_grade1], student_num2: [student_name2, student_grade2], student_num3: [student_name3, student_grade3] }

Básicamente, la primera cadena de la línea debería ser la clave y las 2 cadenas al lado serían el valor. Pero no sé cómo haré que Python separe las cadenas en cada línea y las asigne como la clave y el valor para el diccionario.

EDITAR: Entonces, probé un código: (vi todas sus soluciones, y creo que todas definitivamente funcionarán, pero también quiero aprender a crear mi solución, ¡así que realmente agradecería si pudiera verificar la mía! )

for line in fh:
    line = line.split(";")
    student_num = line[0]
    student_name = line[1]
    student_grade = line[2]

    count =+ 1
    direc[student_num] = [student_name,student_grade]
    student_num = "student_num" + str(count)
    student_grade = "student_grade" + str(count)
    student_name = "student_name" + str(count)

print(direc)

El problema es que obtengo un error de índice de lista fuera de rango en la línea 10 o en esta parte "nombre_alumno = línea [1]"

EDITAR: ¡GRACIAS A TODOS! ¡Cada una de sus soluciones sugeridas funciona! También he arreglado mi propia solución. Este es el fijo (como sugiere @ norok2):

for line in fh:
    line = line.split(" ")
    student_num = line[0]
    student_name = line[1]
    student_grade = line[2]

    count =+ 1
    direc[student_num] = [student_name,student_grade]
    student_num = "student_num" + str(count)
    student_grade = "student_grade" + str(count)
    student_name = "student_name" + str(count)
1
Duts 2 oct. 2019 a las 13:58

6 respuestas

La mejor respuesta

Mi enfoque actual utiliza el manejo de archivos para abrir un archivo en modo de lectura y luego leer las líneas presentes en el archivo. Luego, para cada línea, elimine la nueva línea adicional y los espacios en blanco y divídalos en el espacio, para crear una lista. Luego usó el desempaquetado para almacenar un valor único como key y una lista de 2 valores como value. Valores agregados al dictonario.

temp.txt

student_num1 student_name1 student_grade1
student_num2 student_name2 student_grade2
student_num3 student_name3 student_grade3

main.py

d = dict()
with open("temp.txt", "r") as f:
  for line in f.readlines():
    key, *values = line.strip().split(" ")
    d[key] = values
  print(d)

Salida

{'student_num1': ['student_name1', 'student_grade1'], 'student_num2': ['student_name2', 'student_grade2'], 'student_num3': ['student_name3', 'student_grade3']}
2
taurus05 2 oct. 2019 a las 11:07

file.txt:

student_num1 student_name1 student_grade1
student_num2 student_name2 student_grade2
student_num3 student_name3 student_grade3

Main.py:

def main():
    file = open('file.txt', 'r')
    students = {}
    for line in file:
        fields = line.split(" ")
        fields[2] = fields[2].replace("\n", "")
        students[fields[1]] = [fields[0], fields[2]]

    print(students)
main()

Salida:

{'student_name1': ['student_num1', 'student_grade1'], 'student_name2': ['student_num2', 'student_grade2'], 'student_name3': ['student_num3', 'student_grade3']}
1
Ronak Patel 2 oct. 2019 a las 11:27

Como una comprensión dict:

with open("data.txt", "r") as f:
    students = {k:v for k, *v in map(str.split, f)}

Explicación:

El objeto de archivo f ya es un iterador (que produce cada línea), queremos dividir las líneas, para que podamos usar map(str.split, f) o (line.split() for line in f). Después de eso, sabemos que el primer elemento es la clave del diccionario, y los elementos restantes son los valores. Podemos usar el desempaquetado para eso. Un ejemplo de desempaque:

>>> a, *b = [1,2,3]
>>> a
1
>>> b
[2, 3]

Luego usamos una comprensión para construir el dict con los valores que estamos capturando en el desempaquetado. Una comprensión dictada es una expresión para construir diccionarios, por ejemplo:

>>> {x:x+1 for x in range(5)}
{0: 1, 1: 2, 2: 3, 3: 4, 4: 5}

Ejemplo,

Archivo data.txt:

student_num1 student_name1 student_grade1 
student_num2  student_name2 student_grade2 
student_num3 student_name3 student_grade3

Leerlo

>>> with open("data.txt", "r") as f:
...     students = {k:v for k, *v in map(str.split, f)}
... 
>>> students
{'student_num1': ['student_name1', 'student_grade1'], 'student_num2': ['student_name2', 'student_grade2'], 'student_num3': ['student_name3', 'student_grade3']}
2
Netwave 2 oct. 2019 a las 11:22

La razón por la cual su solución le está dando ese error es que parece que sus líneas no contienen el carácter ;, pero intenta dividirlo por ese carácter con line = line.split(";").

Debe reemplazar eso con:

  • line = line.split(" ") para dividir por el carácter de espacio

O

  • line = line.split(";") para dividir por cualquier carácter en blanco

Sin embargo, para una solución más elegante, consulte aquí.

2
norok2 2 oct. 2019 a las 11:18

¿Has probado algo tan simple como esto?

d = {}
with open('students.txt') as f:
    for line in f:
        key, *rest = line.split()
        d[key] = rest

print(d)
# {'student_num1': ['student_name1', 'student_grade1'], 'student_num2': ['student_name2', 'student_grade2'], 'student_num3': ['student_name3', 'student_grade3']}
1
RoadRunner 2 oct. 2019 a las 11:06
with open('data.txt') as f:
  lines = f.readlines()
d = {}
for line in lines:
  tokens = line.split()
  d[tokens[0]] = tokens[1:]
print(d)

Espero que esto sea entendible. Para dividir las líneas en los diferentes tokens, utilizamos la división 1 función.

3
carlesgg97 2 oct. 2019 a las 11:09
58200110