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

2024-04-20 04:59:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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个SKU。格式正确。由于这是建立在一个只使用导出文件中的信息进行过滤的代码上的,(没有源csv),我觉得我的问题在第二个for循环中,但是我还不太精通如何解决它。你知道吗


Tags: csvinimportsourceforoutputstdoutsys
1条回答
网友
1楼 · 发布于 2024-04-20 04:59:55

不能一次又一次地循环文件,因为一旦读取位置到达末尾,就不能再读取更多的文件了。您必须显式地将read位置放回0,对基础file对象使用file.seek()调用。但这是一个非常糟糕和缓慢的方法。你知道吗

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()要从字典中获取哪些字段(由用于读取exports CSV文件的DictReader()生成),而extrasaction选项定义如何处理字典中的额外键(这里我们忽略这些)。你知道吗

相关问题 更多 >