为 csv 文件中的另一个字段识别具有特殊字符的值
Posted
技术标签:
【中文标题】为 csv 文件中的另一个字段识别具有特殊字符的值【英文标题】:Identify a value with special character for another field in csv file 【发布时间】: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
当没有以'@'开头的单词时
【问题讨论】:
【参考方案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')
【讨论】:
我试过了,但它在除上下文之外的所有字段中创建了两个具有相同值的单独行,就像它创建了两个单独的行一样。我希望如果有多个以'@'开头的单词它们组合在同一行中,如果没有以'@'开头的单词,它也不能解决引发错误的问题 查看更新的答案。这将创建一个逗号分隔的q
s 字符串。如果您想要不同的分隔符,只需更改 ",".join( qs )
部分
嘿,迈克,感谢您的帮助,抱歉回复晚了,这解决了。干杯!【参考方案2】:
您必须在 for 循环之前定义一个变量,这会将所有以 & 开头的字符串放到一个列表中:
r = args.task.split()
q = []
for i in r:
if i.startswith("@"):
q.append(i)
【讨论】:
我试过了,但它在除上下文之外的所有字段中创建了两个具有相同值的单独行,就像它创建了两个单独的行一样。我希望如果有多个以'@'开头的单词它们组合在同一行中,如果没有以'@'开头的单词,它也不能解决引发错误的问题以上是关于为 csv 文件中的另一个字段识别具有特殊字符的值的主要内容,如果未能解决你的问题,请参考以下文章
我的 CSV 文件带有双引号括起来的字段 - 无法识别数值“12131”
数据字符串中具有分隔符/特殊字符的 Redshift 卸载命令
加载值字段包含逗号和特殊字符的 csv 文件时,Hadoop Pig“加载”问题