下面,我试图替换csv中的数据。该代码有效,但它会替换文件中与stocklevel
匹配的任何内容。
def updatestocklevel(quantity, stocklevel, code):
newlevel = stocklevel - quantity
stocklevel = str(stocklevel)
newlevel = str(newlevel)
s = open("stockcontrol.csv").read()
s = s.replace (stocklevel ,newlevel) #be careful - will currently replace any number in the file matching stock level!
f = open("stockcontrol.csv", 'w')
f.write(s)
f.close()
我的csv看起来像这样;
34512340,1
12395675,2
56756777,1
90673412,2
12568673,3
22593672,5
65593691,4
98593217,2
98693214,2
98693399,5
11813651,85
98456390,8
98555567,3
98555550,45
98553655,2
96553657,1
91823656,2
99823658,2
在我的程序的其他地方,我有一个搜索代码的函数(8位数)
是否可以说,如果code
在csv的行中,则替换第二列中的数据? (数据[2])
答案 0 :(得分:2)
当您呼叫stocklevel
时,newlevel
的所有出现都会被s.replace (stocklevel ,newlevel)
的值替换。
string.replace(s,old,new [,maxreplace]):返回字符串s的副本 所有出现的substring old都替换为new。如果是可选的 给出了参数maxreplace,第一个maxreplace出现次数 替换。
正如您的建议,您需要获取code
并使用它替换库存水平。
这是一个示例脚本,它将8位数代码和新的库存级别作为命令行参数adn替换它:
import sys
import re
code = sys.argv[1]
newval= int(sys.argv[2])
f=open("stockcontrol.csv")
data=f.readlines()
print data
for i,line in enumerate(data):
if re.search('%s,\d+'%code,line): # search for the line with 8-digit code
data[i] = '%s,%d\n'%(code,newval) # replace the stock value with new value in the same line
f.close()
f=open("in.csv","w")
f.write("".join(data))
print data
f.close()
使用Python的csv模块的另一种解决方案:
import sys
import csv
data=[]
code = sys.argv[1]
newval= int(sys.argv[2])
f=open("stockcontrol.csv")
reader=csv.DictReader(f,fieldnames=['code','level'])
for line in reader:
if line['code'] == code:
line['level']= newval
data.append('%s,%s'%(line['code'],line['level']))
f.close()
f=open("stockcontrol.csv","w")
f.write("\n".join(data))
f.close()
警告:在覆盖输入文件时尝试使用这些脚本时,请保留输入文件的备份。
如果将脚本保存在名为test.py
的文件中,则将其调用为:
python test.py 34512340 10
。
这应该将代码34512340的股票代码替换为10。
答案 1 :(得分:1)
由于它是csv文件,我建议使用Python的csv
模块。您需要写入一个新文件,因为读取和写入同一个文件会变坏。您可以随后重命名。
此示例使用StringIO
(Python 2)将csv数据嵌入代码中并将其视为文件。通常你会打开一个文件来获取输入。
已更新
import csv
# Python 2 and 3
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
CSV = """\
34512340,1
12395675,2
56756777,1
90673412,2
12568673,3
22593672,5
65593691,4
98593217,2
98693214,2
98693399,5
11813651,85
98456390,8
98555567,3
98555550,45
98553655,2
96553657,1
91823656,2
99823658,2
"""
def replace(key, value):
fr = StringIO(CSV)
with open('out.csv', 'w') as fw:
r = csv.reader(fr)
w = csv.writer(fw)
for row in r:
if row[0] == key:
row[1] = value
w.writerow(row)
replace('99823658', 42)
答案 2 :(得分:1)
为什么不使用好的旧正则表达式?
import re
code, new_value = '11813651', '885' # e.g, change 85 to 885 for code 11813651
print (re.sub('(^%s,).*'%code,'\g<1>'+new_value,open('stockcontrol.csv').read()))