#python #file
Вопрос:
Если у меня есть следующий файл:
Pig 06-13-01 56.2 06-13-02 59.2 06-13-03 54.3 . . . Cow 06-13-01 201.2 06-13-02 204.1 06-13-03 205.6 . . .
и хотите создать экземпляр объекта с данными для животного с соответствующей датой и весом (значение, разделенное вкладкой). Как мне это сделать в моей основной программе?
Я начал с этого:
with open(filnamn, encoding="utf-8") as file: dateAndWeight = [] lines = fil.readlines() lines = [line.rstrip() for line in lines] stepsBetweenName = 68 numberOfAnimals = int(len(lines)/stepsBetweenName)`
Но это только начало. У кого-нибудь есть какой-нибудь совет?
Комментарии:
1. Можете ли вы изменить способ доставки/сохранения этих данных? Было бы намного проще, если бы тип животного был собственным столбцом, а не отдельной строкой для каждой группы.
2. Как вы хотите, чтобы выглядел результат? Вы говорите «объект на животное», один из вариантов-таблица из 3 столбцов с именем животного, датой и весом. Другим был бы словарь, который сопоставляет имя животного со списками 2 столбцов даты и веса.
3. Мне нужно получить доступ к дате и весу в моей основной программе, например, чтобы найти самый высокий и самый низкий вес за этот период. Я не знаю самого простого способа сделать это, но хранить их в качестве экземпляров класса кажется приличным?
Ответ №1:
Ваши данные чередуются между именем животного и данными, разделенными вкладками. Это хорошо подходит для itertools.groupby
того, чтобы создавать свои собственные итераторы на основе такого условия, как количество столбцов.
В этом примере groupby
запускается новая подитерация всякий раз, когда количество строк изменяется от 1 до не-1. Когда его 1, вы знаете, что у вас появилось новое животное. Когда не-1, у вас есть строки данных. Здесь я только что создал словарь, который сопоставляет название животного с его датой/информацией о весе.
import itertools import io import csv # test file file = io.StringIO("""Pig 06-13-01t56.2 06-13-02t59.2 06-13-03t54.3 Cow 06-13-01t201.2 06-13-02t204.1 06-13-03t205.6""") # will hold `animal:[[date, weight], ...]` associations animal_map = {} # data is TSV file reader = csv.reader(file, delimiter="t") # Group by rows of length 1 which start a new set of animal date, weight pairs for new_animal, rows in itertools.groupby(reader, lambda row: len(row) == 1): if new_animal: # get animal from first row animal = next(rows)[0] else: # add animal and data to map animal_map[animal] = list(rows) del animal print(animal_map)
Комментарии:
1. Спасибо за ваш ответ. Однако animal_map просто распечатывает {}, как мне заставить его печатать animal:[[дата, вес], …], как вы описали?
2. Как мне поступить, если у меня есть файл, а не строка? Скажите, что мое имя файла «animaldata.txt», что мне тогда делать?
3. Сделайте свое
with open(filnamn, encoding="utf-8") as file:
дело, чтобы прочитать из файла. Эта штука со StringIO предназначена только для рабочей демонстрации.4. Это печатается
{'Pig': [['06-13-01', '56.2'], ['06-13-02', '59.2'], ['06-13-03', '54.3']], 'Cow': [['06-13-01', '201.2'], ['06-13-02', '204.1'], ['06-13-03', '205.6']]}
для меня. Не уверен, в чем для вас разница в hte.5. Да, теперь все работало нормально. Единственная проблема, с которой я сталкиваюсь, заключается в том, что когда я добавляю новых животных в текстовый файл (с новыми данными в том же формате), они не отображаются в словаре. Почему ты в это веришь?