python - CSV 中多行的字符串替换

标签 python csv

下面是 csv 文件的片段。第一列是产品编号,2 是库存水平,3 是目标水平,4 是距目标的距离(目标减去库存水平)。

34512340,0,95,95
12395675,3,95,92
56756777,70,95,25
90673412,2,95,93

当库存水平达到 5 或以下时,我希望在用户请求时从 python 更新库存水平。

我目前正在使用这段代码,它是我根据更新 CSV 中的一行进行改编的。但它不起作用。第一行作为 34512340,0,95,95 写回文件,文件的其余部分被删除。

    choice = input("\nTo update the stock levels of the above products, type 1. To cancel, enter anything else.")
if choice == '1':
    with open('stockcontrol.csv',newline='') as f:
        for line in f:
            data = line.split(",")
            productcode = int(data[0])
            target = int(data[2])
            stocklevel = int(data[1])
            if stocklevel <= 5:
                target = str(target)
                import sys
                import csv
                data=[]
                newval= target
                newtlevel = "0"
                f=open("stockcontrol.csv")
                reader=csv.DictReader(f,fieldnames=['code','level', 'target', 'distancefromtarget'])
                for line in reader:
                    line['level']= newval
                    line['distancefromtarget']= newtlevel
                    data.append('%s,%s,%s,%s'%(line['code'],line['level'],line['target'],line['distancefromtarget']))
                    f.close()
                    f=open("stockcontrol.csv","w")
                    f.write("\n".join(data))
                    f.close()
                    print("The stock levels were updated successfully")
else:
    print("Goodbye")

这是我在 CSV 文件中更改一行的代码并且有效:

with open('stockcontrol.csv',newline='') as f:
            for line in f:
                if code in line:
                    data = line.split(",")
                    target = (data[2])
    newlevel = stocklevel - quantity
    updatetarget = int(target) - int(newlevel)
    stocklevel = str(stocklevel)
    newlevel = str(newlevel)
    updatetarget = str(updatetarget)
    import sys
    import csv

    data=[]
    code = code
    newval= newlevel
    newtlevel = updatetarget
    f=open("stockcontrol.csv")
    reader=csv.DictReader(f,fieldnames=['code','level', 'target', 'distancefromtarget'])
    for line in reader:
      if line['code'] == code:
        line['level']= newval
        line['distancefromtarget']= newtlevel
      data.append('%s,%s,%s,%s'%(line['code'],line['level'],line['target'],line['distancefromtarget']))
    f.close()

    f=open("stockcontrol.csv","w")
    f.write("\n".join(data))
    f.close()

我可以更改什么以使代码正常工作?我基本上希望程序循环遍历 CSV 文件的每一行,如果库存水平(第 2 列)等于或小于 5,则将库存水平更新为第 3 列中的目标数字,然后在第 4 列为零。

谢谢

最佳答案

下面的代码读取每一行并检查第2列的值。如果它小于或等于5,则将第2列的值更改为第3列的值,并将最后一列更改为0,否则保留所有列不变。

import sys
import csv

data=[]
f=open("stockcontrol.csv")
reader=csv.DictReader(f,fieldnames=['code','level','target','distancefromtarget'])
for line in reader:
  if int(line['level']) <= 5:
    line['level']= line['target']
    line['distancefromtarget']= 0
  data.append("%s,%s,%s,%s"%(line['code'],line['level'],line['target'],line['distancefromtarget']))
f.close()


f=open("stockcontrol.csv","w")
f.write("\n".join(data))
f.close()

遇到代码中的问题:

您首先在不使用 csv 模块的情况下读取文件,并通过拆分行来获取每列中的值。您再次使用 csv 模块的 DictReader 方法来读取已有的值。

关于python - CSV 中多行的字符串替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37729969/

相关文章:

php - 在 Symfony 中设置 CsvEncoder 分隔符

python - 如何在 Python 中实现 matlabs `` ismember( )`` 命令?

java - 将 CSV 文件解析为数组

javascript - 在静态网站中将数据加载到 JavaScript 中以供立即使用的最快方法是什么?

javascript - Angular.js 从 json 数据生成 csv 文件

java - 在java中解析逗号分隔的数据

python - 如何在没有 Mock 的情况下 stub Python 方法

python - 如何根据PEP8拆分多个命令?

python - 截断 Mako 模板中的字符串

python - 多维数组中列的平方和的平方根