【问题标题】:Get python to add serial nos to each entry as it is run让python在运行时为每个条目添加序列号
【发布时间】:2018-03-13 16:31:19
【问题描述】:

我是编程新手,我的问题可能在here 之类的地方找到了答案,这是我搜索了几天后找到的最接近的答案。大多数信息涉及现有的 csvs 或硬编码数据。我试图让程序在每次运行时都创建数据,并在此进行处理,所以这里有点难过。

问题: 当我运行正在制作的程序来记录我的学习块时,我似乎无法让 python 将序列号附加到每个条目。它有多个字段,以下是其中两个:

Date Time 12-03-2018 11:30

下面是sn-p的代码:

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 新手,并不真正知道如何使用数据结构,所以我正在构建小程序来学习。任何帮助都非常感谢,如果这是重复的,请向我指出正确的方向。

【问题讨论】:

    标签: python-3.x csv header serial-number


    【解决方案1】:

    所以,我想通了。以下是我遵循的过程:

    1. 我使用 csv 模块保存 CSV 文件。
    2. 我将pandas 中的CSV 文件作为数据框加载。

    它的作用是,它允许我在每次程序运行时将用户条目附加到 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)
    

    如果有人有更好的解决方案,知道如何高效优雅地完成它会很有启发性。

    感谢您的阅读。

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2017-02-11
      • 2021-06-27
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 2015-06-03
      相关资源
      最近更新 更多