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循环中,我不太精通足以解决它。
答案 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
选项定义如何处理该字典中的额外键(我们在这里忽略它们)。