如何更改.csv文件中一行的最后一个值

时间:2019-07-11 12:23:54

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

我正在使用CLI创建待办事项列表,我想更改行的最后一个值,即状态从“未完成”更改为“完成”

我知道我们不能像这样编辑一个csv文件,所以我们要做的就是读取它更改值,然后覆盖现有文件。 这是csv文件:https://drive.google.com/open?id=1fqc79mtVmZGZ_pb_2zrzDGVDmyMFWi6C 我尝试过:

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('-l', '--select', metavar='', help='-l <used to select the task for modification')
args = parser.parse_args()


    def modify():
        select = args.select
        with open('csv.csv', 'r+', newline='') as file:
            lines = list(file)
            lines[int(select)][7] = 1
        with open('csv.csv', 'w+', newline='') as ifile:
            writer = csv.writer(ifile)
            writer.writerows(lines)

运行此命令时,我希望这样做

python todoarg.py -o modify -l 2

它将第二行的状态从“未完成”更改为“完成”

2 个答案:

答案 0 :(得分:1)

我也找到了一种不用熊猫的方法:

    def modify():
        with open("csv.csv", 'r+') as f:
            lines = f.readlines()
            f.seek(0)

            task = args.select

            for line in lines:
                if not task in line.split(',')[0]:
                    f.write(line)
            for line in lines:
                if task in line.split(',')[0]:
                    #what we do here is print existing values using their index
                    #with split function and adding 'Complete' instead of
                    #6th index which was 'Incomplete'
                    f.write('\n' + line.split(',')[0] + ',' + line.split(',')[1] + ',' + line.split(',')[2] + ','
                            + line.split(',')[3] + ',' + line.split(',')[4] + ','
                            + line.split(',')[5] + ',' + 'Complete')

            f.truncate()

我知道这是一种新颖的方法,但是效果很好

答案 1 :(得分:0)

您亲近了,我看着您的csv,由于您有标题行,我认为最好将dotenv用作唯一的taskid:

S.No

我正在使用Pandas数据框来简化它。 import pandas as pd import argparse parser = argparse.ArgumentParser() parser.add_argument('-o', '--option', metavar='', help='-o <option> write either you want to add or view') # Here I added the action="append" parser.add_argument('-l', '--select', metavar='', help='-l <used to select the task for modification', action="append") args = parser.parse_args() def modify(filename, taskids): taskids = list(map(int, taskids)) # just to change from str to int for your taskids df = pd.read_csv(filename, sep=";") df.loc[df["S.No"].isin(taskids), "Status"] = "complete" df.to_csv(filename, sep=";", index=False) modify("csv.csv", args.select) 行用于选择S.No是您在命令行中指定的任务ID之一的每一行,并将“状态”列更改为“完成”。

我还做了一些我认为您可能会感兴趣的更改:我刚刚在解析器中为df.loc[...]选项添加了一个小的action="append"。这意味着您可以通过执行以下操作来一次更改多个任务:

select

对于您的python todoarg.py -o modify -l 2 -l 6 -l 3 参数,我建议您使用解析器中的option参数:

choices

关于如何基于赋予parser.add_argument( "-o", "--option", type = str, choices = [ "modify", "add", "cook_a_turkey" ], default = "modify", # you can even use a default choice if the parameter is not given metavar = "", help = "some help" ) 参数的值来选择使用哪种方法,我认为我没有很好的方法来做到这一点,但也许这样可以起作用:

option