字符串替换为csv

时间:2016-05-29 09:45:51

标签: python python-3.x csv

下面,我试图替换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])

3 个答案:

答案 0 :(得分:2)

当您呼叫stocklevel时,newlevel的所有出现都会被s.replace (stocklevel ,newlevel)的值替换。

  

string.replace(s,old,new [,maxreplace]):返回字符串s的副本   所有出现的substring old都替换为new。如果是可选的   给出了参数maxreplace,第一个maxreplace出现次数   替换。

source

正如您的建议,您需要获取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()))