在Python中覆盖/更改CSV上的字段
没有太多的Python(3.4)经验,但是我正在开发一个程序,它可以让你添加号码牌和编辑“状态”。这是一个停车程序,因此状态将为In/Out 我唯一的问题是,我不知道如何在输入后编辑CSV文件上的特定字段。从头到尾 例如,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
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文件是变量。我可以补充一下,这意味着它的大小不能被“定义”成这样?我有几个不同的。