【问题标题】:python: changing variable in a row based on previous linepython:根据上一行连续更改变量
【发布时间】:2015-06-24 03:48:09
【问题描述】:

所以我有一个代码可以读取这个 cvs 文件“test.cvs”。脚本的目的是知道什么时候是五包,GK-05 还是 GK-01,然后像这样把颜色加起来,“‘499’,‘GK-05’,‘黑色,银色,橙色,黑蓝' ”。该脚本根据 order_number 读取每一行,如果当前行的 order_number 为空白,则将颜色添加到先前的订单。 Sku 代表包裹类型。请注意,在完成 cvs 中,每三个字段都应该用撇号括起来。

order_number,sku,options
500,GK-01,black
499,GK-05,black
,,silver
,,orange
,,black
,,blue

最终结果应该是:

order_number,sku,options
'500','GK-01','black'
'499','GK-05', 'black, silver, orange, black, blue'

请注意,在完成 cvs 中,每三个字段都应该用撇号括起来。

到目前为止我的代码是这样的:

with open(input_filename, 'r') as input_csv, open(output_filename, 'w',     newline = '') as output_csv:
    reading = csv.reader(input_csv)
    writing = csv.writer(output_csv)

    next(reading)
    previous_row = next(reading)
    for row in reading:
    if row[0] == '' and row[2] == previous_row[2]:
            print ("current: " + previous_row[0])
            print ("This one matches " + row[2])
        else:
            previous_row = row

我的问题是 previous_row 不会坚持为“499,GK-05,黑色”。它总是下一行,所以什么都不会打印出来。如果我删除 else 条件,那么打印将是:

current: 500
This one matches black

我希望它是 499。在我想出下一部分之前,我正在尝试通过根据前几行更改变量来解决第一个问题。但是,如果有人可以帮助将所有颜色加在一起的下一部分,那将非常感激。

感谢您的帮助。

**编辑 Anand S Kumar 的回答对我帮助很大,但并没有解决将字段包含在 '.

【问题讨论】:

  • GK-01 只有一个选项,而GK-05 有五个。我想知道sku是否有规则。而sku 独一无二?

标签: python variables csv for-loop


【解决方案1】:

假设您的代码中的缩进问题不是实际问题,您的问题会发生,因为如果当前行的第一个元素为空,您永远不会将 row[2] 从当前行附加到 previous_row,您需要另一个类似的 elif 条件并且附加当前行的(或 if)。

此外,根据您的逻辑,您甚至不需要第一个 if 条件,这将阻止第 5 行中的 black 进入输出。

代码将是 -

>>> with open('test.csv','r') as input_csv, open('output.csv','w',newline='') as output_csv:
...     reading = csv.reader(input_csv)
...     writing = csv.writer(output_csv)
...     data = [next(reading)]
...     previous_row = next(reading)
...     for row in reading:
...             if row[0] == '':
...                     previous_row.append(row[2])
...             else:
...                     previous_row = ["'{}'".format(previous_row[0]), "'{}'".format(previous_row[1]),"'{}'".format(', '.join(previous_row[2:]))]
...                     data.append(previous_row)
...                     previous_row = row
...     previous_row = ["'{}'".format(previous_row[0]), "'{}'".format(previous_row[1]),"'{}'".format(', '.join(previous_row[2:]))]
...     data.append(previous_row)
...     writing.writerows(data)

【讨论】:

  • 谢谢你!这适用于测试示例。我会用全尺寸试一试。
  • 阿南德,我如何在三个字段周围添加引号,这样它会像:'499','GK-05','black,silver,orange,green,blue'
  • 你可以使用 str.format() 函数,比如 "'{}'".format()
  • @DungTran 请检查最新代码,还请注意这不在您发布的原始要求中。如果您有新问题,应将其作为新问题发布,而不是编辑旧问题。
【解决方案2】:
with open(input_filename, 'r') as input_csv, open(output_filename, 'w', newline = '') as output_csv:
    reading = csv.reader(input_csv)
    writing = csv.writer(output_csv)

    next(reading)
    for row in reading:
        if row[0] == '':
            print ("This one matches " + row[2])
        else:
            print ("current: " + row[0])
            print ("This one matches " + row[2])

【讨论】:

    猜你喜欢
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    相关资源
    最近更新 更多