Как сохранить данные за месяц python - PullRequest
0 голосов
/ 15 января 2020

Таким образом, в основном мой код получает от пользователя все входные данные от баскетбольных мячей, уловок, ракеток и т.д. c, я могу записать их в файл InvenData.txt, но как бы я оставил их после приложения? закрывается? Я использую datetime, есть ли метод, который я могу использовать, чтобы определить месяцы? Это в основном то, как я хочу, чтобы это работало ...

Заполните таблицу (уже выполнено, получает ввод), затем возьмите этот ввод и упорядоченно поместите его в файл (Готово, что также, и это сохраняет месяц в данных тоже) А потом я хочу, чтобы он там оставался. И ДОЛГО, поскольку они все еще находятся в ЭТОМ текущем месяце, он обновит данные ЭТОГО Месяца, и, когда месяц изменится, сбросит, он сбросит данные в тот же формат, что и в прошлом месяце, но чуть дальше вниз по файлу данных

        file.write("Basketballs: " + ballEntry.get() + "\n")
        file.write("Dodgeballs: " + dodgeEntry.get() + "\n")
        file.write("Rackets: " + racketEntry.get() + "\n")
        file.write("Tenisballs: " + TenisballlEntry.get() + "\n")
        file.write("Total: " + totalFile + "\n")
        file.write("Last updated on: " + dateTimeFile + "\n")

Файл выглядит так, когда все пользователи вводят свои данные в

Basketballs: 423
Dodgeballs: 234
Rackets: 253
Tenisballs: 235
Total: 1145
Last updated on: 2020-01-14

ПРИМЕР ЧТО Я ХОЧУ ЭТО СДЕЛАТЬ В СЛЕДУЮЩИЙ МЕСЯЦ *

Basketballs: 4223
Dodgeballs: 23324
Rackets: 2453
Tenisballs: 2335
Total: 11435
Last updated on: 2020-02-01

Спасибо за чтение!

with open('InvenData.txt', 'r') as f:

    filestring1 = file.write("Current Position: %d" % (fileLinePos) + "\n")
    filestring2 = file.write("Basketballs: " + ballEntry.get() + "\n")
    filestring3 = file.write("Dodgeballs: " + dodgeEntry.get() + "\n")
    filestring4 = file.write("Rackets: " + racketEntry.get() + "\n")
    filestring5 = file.write("Tenisballs: " + TenisballlEntry.get() + "\n")
    filestring6 = file.write("Total: " + totalFile + "\n")
    filestring7 = file.write(timeString)
    file.close()

    list = [filestring1, filestring2, filestring3, filestring4, filestring5, filestring6, filestring7]
    lines = list(f)
    for line in lines:
        file.write(line)

print("Data has been registered successfully!")

messagebox.showinfo('Success!', 'Data added to data centre successfully!')

1 Ответ

2 голосов
/ 15 января 2020

модуль datetime может определять время от года до микросекунд.

Вы можете создать строку, используя datetime.datetime.strftime(format), которая использует стандартные замены C для создания строки на основе заданного datetime.

если вы используете datetime.datetime.now(), вы можете использовать текущую дату:

import datetime

time = datetime.datetime.now()
template = 'Last updated on: %Y-%m-%d'
time_string = time.strftime(template)

print(time_string)

# prints "Last updated on: 2020-01-14"

Как вы описали формат файла, последняя строка всегда должна содержать дату последняя запись, так что вам просто нужно потянуть строки до последней записи и извлечь месяц. Для извлечения вы можете использовать datetime.datetime.strptime(input, format) с той же строкой формата:

stripped = datetime.datetime.strptime(time_string, fmt)
print(stripped)
print(stripped.month)

# 2020-01-14 00:00:00
# 1

Что касается работы с данными в файле ... это звучит как проблема XY, поэтому я сначала рассмотрю что вы спрашиваете, затем предложите другую тактику c.

Вы хотите обновить данные, если это тот же месяц, и перезаписать данные, если это новый месяц. Вы не можете просто вставить данные в середину файла: у вас есть доступ к указателю чтения / записи (то есть к текущему символу в файле), и вы можете читать или писать в этой позиции.

Вы можете используйте алгоритм примерно так:

  1. Открыть файл для чтения и записи без усечения ('r +')
  2. захватить текущую позицию курсора с файлом. Tell () (это будет начинаться с 0)
  3. читать строки, пока вы не достигнете строки даты. Для этого вы можете просто проверить с помощью datetime.datetime.strptime (строка «Последнее обновление:% Y-% m-% d»). Ошибка ValueError будет вызвана, если она не совпадает.
  4. , если есть больше строк, снова захватите позицию с помощью file.tell ().
  5. Повторяйте, пока не останется строк для чтения. Убедитесь, что вы не обновляете позицию в конце файла!
  6. Теперь у вас есть позиция начала записи последнего месяца в файле. Перезапишите оставшуюся часть файла новым инвентарём и датой.
  7. Возможно, осталось символов, удалите их.
  8. Закройте файл

Обратите внимание, что я закрываю файл в конце. Как правило, файлы должны быть закрыты как можно скорее ( Почему я должен закрывать файлы в Python? )

Это по той же причине, а также для простоты, что Я бы предложил другую тактику c. Считайте весь файл в список строк, по одной строке в строке:

with open(filename, 'r') as f:
    lines = list(f)

При использовании синтаксиса «как» файл будет закрыт после прочтения строк. Теперь найдите начало записи последней даты (используйте тот же метод из предыдущего алгоритма, но вместо этого в списке.

Измените оставшиеся строки новыми значениями.

Теперь откройте файл в режиме записи. Это обрезает файл (т.е. удаляет все!):

with open(filename, 'w') as f:
  for line in lines:
    f.write(line)

Вы также можете отслеживать номер строки и делать f.readline(), пока не прочитаете все, кроме строк, которые хотите изменить, затем выполните с этого момента f.write(line).

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

Как Кроме того, все это, вероятно, будет упрощено, если вы добавите в свой файл заголовок, содержащий положение символа (используя поиск, описанный в алгоритме) для отслеживания начального символа последней записи в файле

...