Разделение данных в файле в Python - PullRequest
0 голосов
/ 31 октября 2018
class Student:

    def __init__(self, name, hours, qpoints):
        self.name = name
        self.hours = float(hours)
        self.qpoints = float(qpoints)

    def getName(self):
        return self.name

    def getHours(self):
        return self.hours

    def getQPoints(self):
        return self.qpoints

    def gpa(self):
        return self.qpoints/self.hours

def makeStudent(infoStr):

    name, hours, qpoints = infoStr.split("\t")


    return Student(name, hours, qpoints)

def main():
    fileName = input("Enter file name: ")
    infile = open(fileName, "r")

    best = makeStudent(infile.readline())

    for line in infile:
        s = makeStudent(line)
        if s.gpa() > best.gpa():
            best = s

    infile.close()

    print("The best student is:", best.getName())
    print("hours:", best.getHours())
    print("GPA:", best.gpa())

if __name__ == '__main__':
    main()

Я хочу прочитать строку из текстового файла, разделить ее на "\ t" или "," чтобы я мог назначить ее переменным, и я получаю "ValueError: недостаточно значений для распаковки (ожидается 3, получено 1 ) в функции makeStudent (infoStr). Файл, который я использую, написан правильно, я получаю ту же ошибку, если редактирую файл и код в «,» вместо «\ t». Почему это происходит? . Решено.

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Обратите внимание, что вы уже перебираете строки файла с блоком, начинающимся с for line in infile, поэтому нет необходимости выполнять infile.readline() в.

Также вы можете проверить свой формат строки перед отправкой в ​​вашу функцию (или проверить формат в функции, как вам угодно).

{truncated code}

# This loop will put on each iteration the next line of the file in the "line" var.
for line in infile:

    # You need two commas in your line to be able to split it in 3 values.
    if line.count(",") != 2:
        print("WARN: Invalid format in line: "+line)
        # Of course that you could implement some counter to identify
        # the problematic line location within the file...
        quit()

    s = makeStudent(line)
    if s.gpa() > best.gpa():
        best = s

{truncated code}
0 голосов
/ 31 октября 2018

Бьюсь об заклад, это классическая проблема табуляции и пробелов. Ваш файл может быть на самом деле разделен пробелами из-за форматирования IDE или поиска и замены идущего haywire.

Попробуйте это:

def makeStudent(infoStr):
    FAKE_TAB = '    '
    name, hours, qpoints = infoStr.split(FAKE_TAB)

    return Student(name, hours, qpoints)

Если это не сработает, определите, сколько пробелов между каждым значением в каждой строке вручную, а затем замените FAKE_TAB на это. По общему признанию, это немного схематичный патч ...

0 голосов
/ 31 октября 2018

Иногда строка infoStr может не содержать символ, на который вы разбиваетесь (например, пустая строка ''). Оберните это в блок try, и все будет в порядке.

try:
    name, hours, qpoints = infoStr.split('\t')
except ValueError:
    name, hours, qpoints = None, None, None

Вам нужно будет обработать дело None, прежде чем создавать экземпляр Student.

...