Получите python для добавления серийных номеров к каждой записи при ее запуске

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

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

Date Time 12-03-2018 11:30

Ниже приведен фрагмент кода:

d= ''
while d == '':
    d = input('Date:')
    try:
        valid_date = dt.strptime(d, '%Y-%m-%d')
    except ValueError:
        d = ''
        print('Please input date in YYYY-MM-DD format.')

t= ''
while t == '':
    t = input('Time:')
    try:
        valid_time = dt.strptime(t, '%H:%M')
    except ValueError:
        d = ''
        print('Please input time in HH:MM format.')

header = csv.DictWriter(outfile, fieldnames= ['UID', 'Date', 'Time', 'Topic', 'Objective', 'Why', 'Summary'], delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL )
header.writeheader()

log_input = csv.writer(outfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
log_input.writerow([d, t, topic, objective, why, summary])

outfile.close()

df = pd.read_csv('E:\Coursera\HSU\python\pom_blocks_log.csv')
df = pd.read_csv('E:\pom_blocks_log.csv')
df = df.reset_index()
df.columns[0] = 'UID'
df['UID'] = df.index

print (df)

Я получаю следующую ошибку, когда запускаю программу с блоком df: TypeError: Index does not support mutable operations

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


person jodobear    schedule 13.03.2018    source источник


Ответы (1)


Итак, я понял это. Ниже приведен процесс, которому я следовал:

  1. Я сохраняю файл CSV с помощью модуля csv.
  2. Я загружаю файл CSV в pandas как кадр данных.

Это позволяет мне добавлять пользовательские записи в CSV каждый раз, когда программа запускается, а затем я могу загрузить ее как фрейм данных и использовать pandas для соответствующей обработки данных. Затем я добавил генератор для очистки строк от символа-разделителя «,», чтобы его можно было загрузить как фрейм данных для строковых столбцов, где «,» принимается в качестве допустимого ввода. Возможно, это обходной подход, но он работает.

Ниже приведен код:

import csv
from csv import reader
from datetime import datetime
import pandas as pd
import numpy as np


with open(r'E:\Coursera\HSU\08_programming\trLog_df.csv','a', encoding='utf-8') as csvfile:

    # Date
    d = ''#input("Date:")
    while d == '':
        d = input('Date: ')
        try:
            valid_date = datetime.strptime(d, '%Y-%m-%d')
        except ValueError:
            d = ''
            print("Incorrect data format, should be YYYY-MM-DD")

    # Time
    t = ''#input("Date:")
    while t == '':
        t = input('Time: ')
        try:
            valid_date = datetime.strptime(t, '%H:%M')
        except ValueError:
            t = ''
            print("Incorrect data format, should be HH:MM")

    log_input = csv.writer(csvfile, delimiter= ',',
                    quotechar='|', quoting=csv.QUOTE_MINIMAL)
    log_input.writerow([d, t])

# Function to clean lines off the delimter ','
def merge_last(file_name, merge_after_col=7, skip_lines=0):
    with open(file_name, 'r') as fp:
        for i, line in enumerate(fp):
            if i < 2:
                continue
            spl = line.strip().split(',')
            yield (*spl[:merge_after_col], ','.join(spl[merge_after_col:2]))

# Generator to clean the lines
gen = merge_last(r'E:\Coursera\HSU\08_programming\trLog_df.csv', 1)
# get the column names
header = next(gen)
# create the data frame
df = pd.DataFrame(gen, columns=header)

df.head()

print(df)

Если у кого-то есть лучшее решение, было бы полезно узнать, как сделать это эффективно и элегантно.

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

person jodobear    schedule 25.03.2018