在CSV文件中的另一个字段中标识具有特殊字符的值

时间:2019-07-12 11:26:56

标签: python python-3.x python-2.7 csv argparse

我正在使用python创建基于CLI的待办事项列表应用程序,其中包含以下字段:['T.No','Date','Task','Project','Context','Message' ,“状态”]

所以我想要的是当我输入任务时,例如“遇到@Sam和@Jack” 该代码将Sam和Jack识别为“ @”并将其存储在“ Context”列中 样本csv文件:https://drive.google.com/open?id=1mosno15x3XaBMN4k93E8fFwi32pvmXdP

我写了一个用@标识的代码,但是如果有多个以'@'开头的单词,则不包含所有值。如果没有以'@'开头的单词,则会产生错误。

import csv
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-o', '--option', metavar='', help='-o <option> write either you want to add or view')
parser.add_argument('-t', '--task', metavar='', help='-t <task> Enter the task you want to add in the list')
parser.add_argument('-m', '--msg', metavar='', help='-d <description>Enter the description of the task you want to add')
parser.add_argument('-s', '--done', metavar='', help='-s Enter the status Complete if it is', default='Incomplete')
parser.add_argument('-p', '--project', metavar='', help='-d <project> Enter the project name')
parser.add_argument('-l', '--select', metavar='', help='-l <used to select the task for modification')
args = parser.parse_args()

    def addtask():
        r = args.task.split()
        for i in r:
            if i.startswith("@"):
                q = i
        time = datetime.datetime.now()
        t = time.strftime("%d/%m/%Y")
        writer.writerow({'T.No': x, 'Date': t, 'Task': args.task, 'Project': args.project,
                         'Context': q, 'Message': args.msg, 'Status': args.done})
        print('TASK ADDED SUCCESSFULLY')

它不能识别以'@'开头的多个单词并产生

Traceback (most recent call last):
  File "todoarg.py", line 123, in <module>
    main()
  File "todoarg.py", line 109, in main
    addtask()
  File "todoarg.py", line 44, in addtask
    'Context': q, 'Message': args.msg, 'Status': args.done})
UnboundLocalError: local variable 'q' referenced before assignment

如果没有以“ @”开头的单词

2 个答案:

答案 0 :(得分:1)

您必须在for循环之前定义一个变量,这会将所有以&开头的字符串变成一个列表:

r = args.task.split()
q = []
for i in r:
    if i.startswith("@"):
        q.append(i)

答案 1 :(得分:1)

您需要记住列表中的所有q,然后插入列表以为每个q写入新行:

def addtask():
    r = args.task.split()
    qs = []
    for i in r:
        if i.startswith("@"):
            qs.append(i)
    time = datetime.datetime.now()
    t = time.strftime("%d/%m/%Y")
    for q in qs: 
        writer.writerow({'T.No': x, 'Date': t, 'Task': args.task, 'Project': args.project,
                     'Context': q, 'Message': args.msg, 'Status': args.done})
    print('TASK ADDED SUCCESSFULLY')

您还可以组合两个循环并直接写行,而不是先附加到列表。


编辑:在澄清之后,您不想为每个上下文都添加一行:

def addtask():
    r = args.task.split()
    qs = []
    for i in r:
        if i.startswith("@"):
            qs.append(i)
    time = datetime.datetime.now()
    t = time.strftime("%d/%m/%Y")
    q = ",".join( qs )
    writer.writerow({'T.No': x, 'Date': t, 'Task': args.task, 'Project': args.project,
                    'Context': q, 'Message': args.msg, 'Status': args.done})
    print('TASK ADDED SUCCESSFULLY')