Проблема с присвоением нескольких значений нескольким переменным в python - PullRequest
0 голосов
/ 25 апреля 2020

Я не понимаю, почему мой код не работает. скажем, файл, который я пытаюсь открыть, содержит следующее:

Luke,89,94,81,97
Eva,40,50,65,90
Joseph,55,58,54,99
Oliver,73,74,89,91

И это функция, которую я написал:

def my_func(myfile):
    out_dict = {}
    somefile = open(myfile)
    data = somefile.readlines()
    for line in data:
        name,course1,course2,course3,course4 = line
        out_dict[name] = [float(course1), float(course2), float(course3), float(course4)]
    return out_dict
print(my_func("newfile.txt"))

Я пытаюсь добавить каждую строку в словарь, в котором имя каждого человека является ключом. Моя проблема в строке 6, где я пытаюсь назначить 5 значений для 5 переменных. Я получаю сообщение об ошибке «слишком много значений для распаковки (ожидается 5)». но когда я использую эту строку кода вместо оригинальной, она работает:

name,course1,course2,course3,course4 = line.split(',')

Насколько я знаю, что-то вроде этого работает:

v,x,z,y = "John",1,2,3

Но почему не оригинал код в строке 6 тоже работает?

Ответы [ 3 ]

0 голосов
/ 25 апреля 2020

line - это строка символов . Это определенный c тип в Python, полученный в результате чтения строк в файле. Каждая строка в файле возвращает 1 символьную строку с readlines().

Python не может угадать, как назначить имя вашей переменной, course1, course2, course3, course4 из этой строки. , не имеет особого значения для строки символов.

Поэтому вам нужно указать Python, чтобы разбить строку на совпадения ,. Это создаст список строк , и в этом случае, поскольку ожидаемое число переменных слева соответствует количеству элементов в созданном списке справа, это работает.

Действительно обозначение v,x,z,y = "John",1,2,3 на самом деле является синтактическим c сахаром (сокращение) для v,x,z,y = ["John", 1, 2, 3]. На самом деле это не совсем так (подробнее: https://note.nkmk.me/en/python-multi-variables-values/), но этого достаточно, чтобы вы поняли сейчас.

0 голосов
/ 25 апреля 2020
data = somefile.readlines()
   for line in data:
       name,course1,course2,course3,course4 = line

В этом случае строка является строковой переменной, которая содержит одну строку. Целая строка из файла.

Это не то же самое, что запись x,y,z = "John",1,2, но больше похоже на x,y,z = "John,1,2", с которым интерпретатор python не знает, что делать.

Метод split рассказывает, как интерпретировать строку (вырезать их через запятую) и, таким образом, может выполнять несколько назначений.

0 голосов
/ 25 апреля 2020

Ваш первый фрагмент кода не будет работать, потому что вы пытаетесь распаковать line, что является строкой, чтобы лучше понять, рассмотрите следующее, например, которое выдает ошибку,

>>> a, b = "apple strawberry"
ValueError: too many values to unpack

Итак, чтобы распаковать строку вам придется разделить строку по вашему выбору в качестве разделителя, который будет ,. Так, например, будет работать следующий пример:

>>> a, b = "apple strawberry".split()
>>> a
'apple'
>>> b
'strawberry'

Теперь, когда мы подошли к решению, ваш файл является CSV-файлом, поэтому для обработки * лучше использовать встроенный модуль python csv. 1011 * файл,

Использование:

import csv

def read_csv(path):
    out_dict = {}
    with open(path) as file:
        reader = csv.reader(file, skipinitialspace=True)
        for line in reader:
            out_dict[line[0]] = list(map(float, line[1:]))

    return out_dict

print(read_csv("newFile.txt"))

Печать:

{'Luke': [89.0, 94.0, 81.0, 97.0], 'Eva': [40.0, 50.0, 65.0, 90.0], 'Joseph': [55.0, 58.0, 54.0, 99.0], 'Oliver': [73.0, 74.0, 89.0, 91.0]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...