Python For循环仅在CSV上运行一次

时间:2015-09-02 15:43:36

标签: python loops csv

import csv
import sys

source = csv.DictReader(open('source.csv'))
export = csv.DictReader(open('export.csv'))
sys.stdout = open('output.csv','w')
val = 0

def output():
   for row in source:
        val = row['SKU'] 
        for row in export:
            if row['SKU'] == val:
                print '"' + row['SKU'] + '"' + ',' + '"' + row['DESC']  + '"' +  ',' + '"' +  row['COST'] + '"' +  ',' + '"' + row['MSRP'] + '"' + ',' + '"' + row['CORE'] + '"' +  ',' + '"' + row['WEIGHT'] + '"' + ',' + '"' + row['HEIGHT'] + '"' + ',' + '"' + row['LENGTH'] + '"' + ',' + '"' + row['WIDTH'] + '"' 
        else: 
            continue

output()

这只抓取源文件中的第一个SKU。而不是源文件中的所有15000 skus。格式化是正确的。由于这是基于一个代码,它只能使用来自导出文件的信息进行过滤,(没有源csv)我感觉我的问题是在第二个for循环中,我不太精通足以解决它。

1 个答案:

答案 0 :(得分:2)

你不能一次又一次地循环文件,不,因为一旦读取位置到达终点,你就无法阅读更多内容。您必须使用对基础文件对象的file.seek()调用,将读取位置显式返回0。但这是一种非常糟糕和缓慢的方法。

将您的export数据存储在字典中,这样您就可以在固定时间内查找匹配的SKU:

fields = ('SKU', 'DESC', 'COST', 'MSRP', 'CORE', 'WEIGHT', 'HEIGHT', 'LENGTH', 'WIDTH')

with open('export.csv', 'rb') as export:
    # store just the columns the output needs
    exports = {row['SKU']: row for row in csv.DictReader(export)}

with open('source.csv', 'rb') as source, open('output.csv', 'wb') as output:
    reader = csv.DictReader(source)
    writer = csv.DictWriter(
        output, quoting= csv.QUOTE_ALL,
        fieldnames=fields, extrasaction='ignore')
    for row in reader:
        if row['SKU'] in exports:
            writer.writerow(exports[row['SKU']])

现在您只需要迭代输入CSV文件一次。我使用csv.DictWriter()对象来生成输出,而不是打印。通过将quoting选项设置为csv.QUOTE_ALL,您可以获得引用列。

fieldnames参数告诉DictWriter()从字典中获取哪些字段(由用于读取导出CSV文件的DictReader()生成)和extrasaction选项定义如何处理该字典中的额外键(我们在这里忽略它们)。