【问题标题】:Identify a value with special character for another field in csv file为 csv 文件中的另一个字段识别具有特殊字符的值
【发布时间】:2019-11-22 04:02:30
【问题描述】:

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

所以我想要的是当我输入任务时,例如“遇见@Sam 和@Jack” 该代码使用“@”识别 Sam 和 Jack,并将它们存储在“上下文”列中 示例 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

当没有以'@'开头的单词时

【问题讨论】:

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


    【解决方案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')
    

    【讨论】:

    • 我试过了,但它在除上下文之外的所有字段中创建了两个具有相同值的单独行,就像它创建了两个单独的行一样。我希望如果有多个以'@'开头的单词它们组合在同一行中,如果没有以'@'开头的单词,它也不能解决引发错误的问题
    • 查看更新的答案。这将创建一个逗号分隔的qs 字符串。如果您想要不同的分隔符,只需更改 ",".join( qs ) 部分
    • 嘿,迈克,感谢您的帮助,抱歉回复晚了,这解决了。干杯!
    【解决方案2】:

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

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

    【讨论】:

    • 我试过了,但它在除上下文之外的所有字段中创建了两个具有相同值的单独行,就像它创建了两个单独的行一样。我希望如果有多个以'@'开头的单词它们组合在同一行中,如果没有以'@'开头的单词,它也不能解决引发错误的问题
    猜你喜欢
    • 2012-08-03
    • 2013-11-07
    • 1970-01-01
    • 2014-04-25
    • 2017-03-28
    • 2018-09-25
    • 1970-01-01
    • 2021-03-31
    • 2016-11-29
    相关资源
    最近更新 更多