在Python中覆盖/更改CSV上的字段

在Python中覆盖/更改CSV上的字段,python,csv,Python,Csv,没有太多的Python(3.4)经验,但是我正在开发一个程序,它可以让你添加号码牌和编辑“状态”。这是一个停车程序,因此状态将为In/Out 我唯一的问题是,我不知道如何在输入后编辑CSV文件上的特定字段。从头到尾 例如,CSV: NH08OTR, 2008, Vauxhall, Corsa, Blue, In 我希望能够将最后一个字段从“In”更改为“Out”,但是CSV将具有可变的行数,因此我只希望它在特定的车牌上执行。示例如下: Please choose a number plate

没有太多的Python(3.4)经验,但是我正在开发一个程序,它可以让你添加号码牌和编辑“状态”。这是一个停车程序,因此状态将为In/Out

我唯一的问题是,我不知道如何在输入后编辑CSV文件上的特定字段。从头到尾

例如,CSV:

NH08OTR, 2008, Vauxhall, Corsa, Blue, In
我希望能够将最后一个字段从“In”更改为“Out”,但是CSV将具有可变的行数,因此我只希望它在特定的车牌上执行。示例如下:

Please choose a number plate to change the status of: NH08OTR
Status change: Out
Status successfully changed to 'Out'
然后我希望它将CSV上的“输入”更改为“输出”

希望您能理解并感谢您的阅读。

给出csv:

NH08OTR, 2008, Vauxhall, Corsa, Blue, In
NH08OTY, 2008, Vauxhall, Corsa, Blue, Out
NH08OTZ, 2008, Vauxhall, Corsa, Blue, In
我们要打开它,在内存中编辑它,然后保存编辑,因此:

import csv

# Open csv
r = csv.reader(open('car_parking.csv')) 
line_in = [k for k in r]

#look for plate
number_plate  = 'NH08OTZ'

#get current parking status
find_plate=([i for i,k in enumerate(line_in) if k[0] == number_plate]) #find plate in array
current_park_status = line_in[find_plate[0]][5]

print current_park_status

#edit array position, with new status
new_parking_status = 'IN'
line_in[find_plate[0]][5] = new_parking_status

#overwrite cv with new result 
out = csv.writer(open('car_parking.csv', 'w'))
out.writerows(line_in)

假设您有一个包含内容的文件
plate\u status.csv

""" 
NH08OTR, 2008, Vauxhall, Corsa, Blue, In
NH0873R, 2004, Vauxhall, Corsa, Red, Out
...
"""
等等。只要文件不太大,我会先读取整个文件,然后更新并覆盖:

import csv

def update_status( filename, plate, status ):
    # read and update
    with open( filename) as f:
        reader = csv.reader( f, delimiter=',' )
        line_dict = dict([ ( x[0].strip() , map(lambda y:y.strip() ,x[1:])) for x in reader] )
        line_dict[ plate ][-1] = status

    # save new
    with open( 'plate_status.txt', 'w') as f:
        writer = csv.writer(f )
        new_file_rows = map( lambda x : [ x[0] ]+ x[1], line_dict.iteritems() )
        writer.writerows( new_file_rows )            

update_status( 'plate_status.csv', 'NH08OTR', 'Out' )
现在,文件
plate\u status.csv
显示:

""" 
NH08OTR, 2008, Vauxhall, Corsa, Blue, Out
NH0873R, 2004, Vauxhall, Corsa, Red, Out
...
"""

谢谢,不过目前练习使用的是CSV(应该说,oops)而不是数据库。@harrygooz33好的,请查看更新,按您喜欢的方式编辑。哇,谢谢。问一个简单的问题,听起来可能很傻,但我和k是从哪里来的?这还会生成一个索引器:Traceback(最近一次调用last):文件“G:\CS LIST WORK\application.py”,位于find_plate=([i代表i,k在enumerate(line_in)中,如果k[0]==number_plate])文件“G:\CS LIST WORK\application.py”,位于find_plate=([i代表i,k在enumerate(line_in)中,如果k[0]==number_plate])索引器:列出索引,共个range@harrygooz33确保您的csv文件与上面的格式完全相同,否则它将无法工作,同时确保它位于同一文件夹中。在列表理解中,k和i只是用作抽象符号,它们对输出没有影响,并且与任何声明的变量都不相关。CSV文件是变量。我可以补充一下,这意味着它的大小不能被“定义”成这样?我有几个不同的。