Считывание данных, разделенных вкладкой, из файла

#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. Да, теперь все работало нормально. Единственная проблема, с которой я сталкиваюсь, заключается в том, что когда я добавляю новых животных в текстовый файл (с новыми данными в том же формате), они не отображаются в словаре. Почему ты в это веришь?