Python列表会在每个条目中生成重复项

时间:2017-10-03 11:48:30

标签: python python-2.7

我需要一个小蟒蛇脚本,他会问我3个问题,然后使用这3个答案的列表创建一个.csv文件(其中一个在每一行都是相同的),它解释起来有点复杂但是在示例中很容易看到,所以有一个例子:

What fruit do you want to purchase ?
- Apples
What color ?
- Red
How many?
- 10
What color ?
- Green
How many?
- 30

结果文件应该有:

Fruit;Color;Qty
Apples;Red;10
Apples;Green;30

我几乎用这段代码完成了它:

#!/usr/bin/python
# -*- coding: utf-8 -*-
dataDir = 'Data/Orders/'
class NewOrders:
    def Create(self):
        orderNum = str(raw_input('Introduce order reference: '))
        orderName = 'ORDERS'+orderNum+'.csv'
        fruitType = str(raw_input('What fruit do you want to purchase: '))
        order = open(dataDir+orderName,'wb')
        order.write('Fruit;Color;Qty\n')
        fruitList=[]
        while 1:
            fruitColor=raw_input('What color: ')
            fruitNumber=raw_input('How many: ')
            if fruitColor=='':
                break
            fruitList.append(fruitColor+';'+fruitNumber+';'+fruitType)
            for article in fruitList:
                order.write('%s\n' % article)
Orders = NewOrders()
Orders.Create()

但结果文件有:

Fruit;Color;Qty
Red;30;Apples
Red;30;Apples
Green;10;Apples

每次引入新行时,都会复制以前的行。

一些提示或帮助将不胜感激。

感谢大家。

1 个答案:

答案 0 :(得分:3)

每次向其添加其他条目时,您都会写出fruitList

while 1:
    fruitColor=raw_input('What color: ')
    fruitNumber=raw_input('How many: ')
    if fruitColor=='':
        break
    fruitList.append(fruitColor+';'+fruitNumber+';'+fruitType)
    for article in fruitList:
        order.write('%s\n' % article)

每次添加颜色时都会运行最后的for循环,因此它会写入第一个条目,然后当您添加第二个条目时,它会写入第一个条目并且第二,如果你要添加第三个,它会写第一个,第二个和第三个等等。

通过取消缩进来移动for循环的while 1:循环

while 1:
    fruitColor=raw_input('What color: ')
    fruitNumber=raw_input('How many: ')
    if fruitColor=='':
        break
    fruitList.append(fruitColor+';'+fruitNumber+';'+fruitType)

for article in fruitList:
    order.write('%s\n' % article)

或者,不要在所有中使用列表,只需直接写下您附加到文件中的字符串:

while 1:
    fruitColor=raw_input('What color: ')
    fruitNumber=raw_input('How many: ')
    if fruitColor=='':
        break
    order.write(fruitColor+';'+fruitNumber+';'+fruitType)

您可能需要查看csv module,这样可以避免所有;个连接:

import csv


orderNum = raw_input('Introduce order reference: ')
fruitType = str(raw_input('What fruit do you want to purchase: '))

with open('ORDERS{}.csv'.format(orderNum), 'wb') as out:
    order = csv.writer(out, delimiter=';')
    order.writerow(['Fruit', 'Color', 'Qty'])
    while True:
        fruitColor = raw_input('What color: ')
        if not fruitColor:
            break
        fruitNumber = raw_input('How many: ')
        order.writerow([fruitColor, fruitNumber, fruitType])