Не удалось добавить новую строку в таблицу с сохраненным txt файлом

Вопрос: Я новичок в python и программировании в целом, поэтому, пожалуйста, несите меня, если я не буду правильно объяснять вещи или использовать правильную терминологию. Точно так же я, вероятно, не пойму вас, если вы дадите мне очень технический ответ. Я стараюсь изо всех сил, но это ново для меня и очень сложно! Я пытаюсь изучить

Вопрос:

Я новичок в python и программировании в целом, поэтому, пожалуйста, несите меня, если я не буду правильно объяснять вещи или использовать правильную терминологию. Точно так же я, вероятно, не пойму вас, если вы дадите мне очень технический ответ. Я стараюсь изо всех сил, но это ново для меня и очень сложно!

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

Здесь мой модуль, который я использую, создает список походов. В каждом походе есть пункт назначения, пробег, hiked, дни и партнер. Эта часть программы работает по назначению. После ввода информации введенные данные сохраняются в виде списка с именем stored_words, а затем этот список добавляется как строка в таблицу. Стол распечатывается после того, как вы закончите походы.

def Hikes(): import prettytable import csv answer = «yes» Index = 0 mytable = prettytable.PrettyTable() x = prettytable.PrettyTable([«Destination», «Miles Hiked», «Days Hiked», «Partner»]) x.align[«Destination»] = «l» # Left align destination x.padding_width = 1 # One space between column edges and contents (default) while answer == «yes»: words = [«destination», «miles hiked», «days hiked», «partner»] stored_words = [] HikeList = [] hikesave = open(«hikes.txt» , «a») for word in words: answer = input(«Enter the %s:» % word) stored_words.append(answer) print(stored_words) HikeList.append(stored_words) hikesave.write(‘n’) hikesave.write(str(stored_words)) x.add_row(stored_words) hikesave.close() answer = input(«Enter another hike? yes or no: «) print(x) return x

Здесь мой модуль, который я создал для загрузки файла:

def LoadFile(): import prettytable Flag = False FileToLoad = str mytable = prettytable.PrettyTable() x = prettytable.PrettyTable([«Destination», «Miles Hiked», «Days Hiked», «Partner»]) x.align[«Destination»] = «l» # Left align destination x.padding_width = 1 # One space between column edges and contents (default) print(«————————————«) print(» A = Hikes») print(» B = Miles List») print(» B = Destinations List») print(«————————————«) print() FileToLoad = input(«Which file would you like to open?») while Flag == False: #Loop will keep running until true while FileToLoad == «A» or FileToLoad == «B» or FileToLoad == «C»: if FileToLoad == «A with open(«hikes.txt», «r») as f: lines = f.readline() print(lines) x.add_row(lines) ## f = open(«hikes.txt», «r») ## for line in f: ## print(line) ## x.add_row(line) print(x) Flag = True

Я просто не могу понять, как загрузить файл (hikes.txt) в модуле LoadFile, и иметь данные внутри этого файла, добавленного по строкам подряд, к таблице. Когда я пытаюсь сделать это, я получаю эту ошибку в своем выходе:

———————————— A = Hikes B = Miles List C = Destinations List ———————————— Which file would you like to open?A [‘High Country Pathway, MI’, ’82’, ‘4’, ‘solo’] Traceback (most recent call last): File «D:Program FilesPROGRAMMINGPython11-3-13.py», line 260, in <module> main() File «D:Program FilesPROGRAMMINGPython11-3-13.py», line 66, in main c = LoadFile() File «D:Program FilesPROGRAMMINGPython11-3-13.py», line 216, in LoadFile x.add_row(lines) File «D:Program FilesPROGRAMMINGPythonlibsite-packagesprettytable.py», line 818, in add_row raise Exception(«Row has incorrect number of values, (actual) %d!=%d (expected)» %(len(row),len(self._field_names))) **Exception: Row has incorrect number of values, (actual) 48!=4 (expected)**

Я не понимаю, почему я получаю вышеуказанную ошибку.

Эта:

[‘High Country Pathway, MI’, ’82’, ‘4’, ‘solo’]

должен быть добавлен в строку в превосходном… том же формате, что и в предыдущем модуле.

Любая помощь будет принята с благодарностью. Я не мог найти никакой информации об полученном сообщении об ошибке и читал на входе/выходе файла, но не могу понять это. Я знаю, что в моем коде есть, наверное, много ошибок, но помните, что я ОЧЕНЬ НОВЫЙ для python и просто пытаюсь заставить работать, поэтому, пожалуйста, не слишком сильно меня беспокоите.

**Редактировать

Stevha, я попробовал код, который вы поставили, но я все равно получаю ту же ошибку, за исключением теперь 7! = 4:

Traceback (последний последний вызов): Файл “D:Program FilesPROGRAMMINGPython11-3-13.py”, строка 265, в главном() файле “D:Program FilesPROGRAMMINGPython11- 3-13.py “, строка 66, в основном c = LoadFile() Файл” D:Program FilesPROGRAMMINGPython11-3-13.py “, строка 219, в файле LoadFile x.add_row (строка) “D:Program FilesPROGRAMMINGPythonlibsite-packagesprettytable.py”, строка 818, в add_row raise Исключение (“Строка имеет неправильное количество значений, (актуально)% d! =% D (ожидается) “% (len (row), len (self._field_names))) Исключение: строка имеет неправильное количество значений, (фактическое) 7! = 4 (ожидается)

Раньше я смотрел на рассол и JSON и не понимал, что мне нужно делать. Я думал, что текстовый файл будет работать. Он работает для печати информации, что не проблема, но до сих пор не для вставки в prettytable. Я также изучал импорт csv, но сначала пытался заставить его работать с текстовым файлом.

Спасибо за ваши другие предложения. Я собирался пройти через код позже, когда у меня все получится, и сделаю вводную проверку и т.д., Но пока я просто ковыряюсь, пытаясь заставить все работать. Я изучаю, что могу и не могу сделать с python, пытаясь понять, как все работает. Я знаю там какой-то неиспользуемый код, например список HikeList. Я сделал это, пытаясь сохранить данные по-разному в текстовом файле в надежде пройти мимо этой ошибки.

Вот как выглядит моя программа, когда я ввожу данные, которые сохраняются в файле hikes.txt:

Choose from the list below: A = Enter Miles Hiked B = Enter hiking destination C = Load File E = Exit program ————————————————— Enter your selection: b Enter the destination:Big Bend, TX [‘Big Bend, TX’] Enter the miles hiked:45 [‘Big Bend, TX’, ’45’] Enter the days hiked:5 [‘Big Bend, TX’, ’45’, ‘5’] Enter the partner:Dan [‘Big Bend, TX’, ’45’, ‘5’, ‘Dan’] Enter another hike? yes or no: no +—————+————-+————+———+ | Destination | Miles Hiked | Days Hiked | Partner | +—————+————-+————+———+ | Big Bend, TX | 45 | 5 | Dan | +—————+————-+————+———+

Операторы печати там временно, поэтому я могу видеть, что вводится в текстовый файл. После добавления новых походов в файл hikes.txt это выглядит так:

[‘High Country Pathway, MI’, ’82’, ‘4’, ‘solo’] [‘Wemincuhe Wilderness, CO’, ’55’, ‘6’, ‘Lisa’] [‘Big Bend, TX’, ’45’, ‘5’, ‘Dan’]

Каждая строка в текстовом файле содержит значение для всех 4 столбцов в таблице в формате списка. Ошибка говорит мне, что нет 4 значений, но не у меня есть список, содержащий 4 значения в каждом списке? Если он думает, что это строка, а не список, то как я могу сказать python, что каждая строка в моих файлах hikes.txt является списком?

Ответ №1

Я думаю, вам понадобится код, похожий на этот:

with open(«hikes.txt», «r») as f: for line in f: row = line.split() x.add_row(row)

Вы можете взять объект “open file” f и использовать его for цикла for. Когда вы это сделаете, переменная цикла (в этой row примера) будет установлена в одну строку из файла и выполняется цикл цикла.

Кстати, когда вы запрашиваете пользователя для ввода, вы можете сделать что-то вроде этого:

choice = input(«Which file would you like to open?») choice = choice.strip() # remove leading and trailing white space choice = choice.lower() # convert to lower-case

Затем вы можете сравнить choice с ‘a’ и ‘b’ и т.д., И это будет немного прощающим (пользователю не нужно будет иметь верхний регистр, а если пользователь попадет в пробел по ошибке, он все равно будет работать),

Вы можете сделать все это в одной строке:

choice = input(«Which file would you like to open?»).strip().lower()

EDIT: я действительно не понимаю ваш код для сохранения данных похода. Похоже, вы сразу пишете все данные о походах, и я не думаю, что то, как вы это делаете, будет работать.

Я предлагаю вам либо написать очень простой формат, по одной строке за раз, либо сохранить все данные в списке и записать список, используя библиотечную функцию. Лучшим выбором будет Python native pickle или JSON с использованием модуля json.

Предполагая, что вы хотите написать простой формат, CSV будет хорошим выбором. Если вы ищете Google для “Python CSV tutorial”, вы найдете много помощи, и здесь также много материала на StackOverflow.

EDIT: Также ясно, что вы очень новичок в Python. Я бы посоветовал вам работать через введение в Python, например “Learn Python the Hard Way”, или прочитать хорошую книгу Python.

Это не требуется 100%, но это очень хорошая идея, чтобы изучить идиомы сообщества Python и следовать им. Например, имена переменных должны использовать строчные буквы и символы подчеркивания; Исходные колпачки должны быть зарезервированы для имен классов. Это записано в стандарте “PEP 8”. Если вы посмотрите, как StackOverflow имеет синтаксис, выделил ваш код, вы увидите, что HikeList показан иначе, чем другие переменные; это потому, что оно помечено как имя класса, так как оно начинается с заглавной буквы.

Кроме того, мой совет состоит в том, чтобы разбить вашу программу на мелкие кусочки и проверить каждую часть. Вы протестировали, что ваш код создания файла делает то, что вы хотели бы сделать? Вы посмотрели выходной файл hikes.txt который вы получили, когда закончите?

Кроме того, вот что такое сообщение об ошибке. Вы создали PrettyTable класса PrettyTable и настроили его для таблицы с четырьмя столбцами. Поэтому он ожидает, что каждая строка ввода будет списком с 4 элементами в списке. Но вы передали строку. Python будет притворяться, что строка представляет собой список символов, поэтому ваш экземпляр PrettyTable увидел список из 48 вещей (каждая вещь была одним символом). В моем примере кода используется .split() метода .split() для разделения строки на пробелы, но вы можете использовать CSV с каким-либо другим разделителем, и, вероятно, было бы лучше.

Оцените статью
Добавить комментарий