2015-09-02 3 views
0
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), я упал, так как моя проблема находится во втором цикле, я недостаточно разбираюсь в ней, чтобы устранить ее.Python Для цикла только один раз на CSV

+0

Вы не можете перебирать файлы снова и снова, нет, потому что, как только позиция чтения дойдет до конца, вы не сможете прочитать больше. Вам придется явно поставить позицию чтения на 0. Но это очень плохой и медленный метод. –

ответ

2

Вы не можете перебирать файлы снова и снова, нет, потому что, как только позиция чтения дойдет до конца, вы не сможете прочитать больше. Вам нужно было бы явно поместить позицию чтения обратно в 0, используя вызов 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(), какие поля взять из словаря (производимого DictReader() используется для чтения файла экспорта CSV), а параметр extrasaction определяет, что делать с дополнительными клавишами в этом словаре (мы игнорируем те здесь).

+0

Отлично, можете ли вы использовать понимание списка и csv.writerows? например 'import_rows = [export [row ['SKU']] для строки в читателе, если строка ['SKU'] в экспорте] writer.writerows (import_rows)' –

+0

Отлично работает, спасибо! Это станет основой полезного инструмента. В конце концов Python полностью заменит Excel для меня, это намного быстрее. –

+1

@VivekSable: вы можете использовать там выражение-генератор, за исключением того, что 'DictWriter.writerows()' материализует весь список в памяти в первую очередь. В этом отношении это не так эффективно. –

Смежные вопросы