title: Scrapy python csv output has blank lines between each row
body: <p>I am getting unwanted blank lines between each row of scrapy output in the resulting csv output file.</p>
  
  <p>I have moved from python2 to python 3, and I use Windows 10.  I am therefore in the process of adapting my scrapy projects for python3.</p>
  
  <p>My current (and for now, sole) problem is that when I write the scrapy output to a CSV file I get a blank line between each row.  This has been highlighted on several posts here (it is to do with Windows) but I am unable to get a solution to work.</p>
  
  <p>As it happens, I have also added some code to the piplines.py file to ensure the csv output is in a given column order and not some random order.  Hence, I can use the normal <code>scrapy crawl charleschurch</code> to run this code rather than the <code>scrapy crawl charleschurch -o charleschurch2017xxxx.csv</code></p>
  
  <p>Does anyone know how to skip / omit this blank line in the CSV output?</p>
  
  <p>My pipelines.py code is below (I perhaps don't need the <code>import csv</code> line but I suspect I may do for the final answer):</p>
  
  <pre><code># -*- coding: utf-8 -*-
  
  # Define your item pipelines here
  #
  # Don't forget to add your pipeline to the ITEM_PIPELINES setting
  # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
  
  import csv
  from scrapy import signals
  from scrapy.exporters import CsvItemExporter
  
  class CSVPipeline(object):
  
    def __init__(self):
      self.files = {}
  
    @classmethod
    def from_crawler(cls, crawler):
      pipeline = cls()
      crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
      crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
      return pipeline
  
    def spider_opened(self, spider):
      file = open('%s_items.csv' % spider.name, 'w+b')
      self.files[spider] = file
      self.exporter = CsvItemExporter(file)
      self.exporter.fields_to_export = ["plotid","plotprice","plotname","name","address"]
      self.exporter.start_exporting()
  
    def spider_closed(self, spider):
      self.exporter.finish_exporting()
      file = self.files.pop(spider)
      file.close()
  
    def process_item(self, item, spider):
      self.exporter.export_item(item)
      return item
  </code></pre>
  
  <p>I added this line to the settings.py file (not sure the relevance of the 300):</p>
  
  <pre><code>ITEM_PIPELINES = {'CharlesChurch.pipelines.CSVPipeline': 300 }
  </code></pre>
  
  <p>my scrapy code is below:</p>
  
  <pre><code>import scrapy
  from urllib.parse import urljoin
  
  from CharlesChurch.items import CharleschurchItem
  
  class charleschurchSpider(scrapy.Spider):
      name = "charleschurch"
      allowed_domains = ["charleschurch.com"]    
      start_urls = ["https://www.charleschurch.com/county-durham_willington/the-ridings-1111"]
  
  
      def parse(self, response):
  
          for sel in response.xpath('//*[@id="aspnetForm"]/div[4]'):
             item = CharleschurchItem()
             item['name'] = sel.xpath('//*[@id="XplodePage_ctl12_dsDetailsSnippet_pDetailsContainer"]/span[1]/b/text()').extract()
             item['address'] = sel.xpath('//*[@id="XplodePage_ctl12_dsDetailsSnippet_pDetailsContainer"]/div/*[@itemprop="postalCode"]/text()').extract()
             plotnames = sel.xpath('//div[@class="housetype js-filter-housetype"]/div[@class="housetype__col-2"]/div[@class="housetype__plots"]/div[not(contains(@data-status,"Sold"))]/div[@class="plot__name"]/a/text()').extract()
             plotnames = [plotname.strip() for plotname in plotnames]
             plotids = sel.xpath('//div[@class="housetype js-filter-housetype"]/div[@class="housetype__col-2"]/div[@class="housetype__plots"]/div[not(contains(@data-status,"Sold"))]/div[@class="plot__name"]/a/@href').extract()
             plotids = [plotid.strip() for plotid in plotids]
             plotprices = sel.xpath('//div[@class="housetype js-filter-housetype"]/div[@class="housetype__col-2"]/div[@class="housetype__plots"]/div[not(contains(@data-status,"Sold"))]/div[@class="plot__price"]/text()').extract()
             plotprices = [plotprice.strip() for plotprice in plotprices]
             result = zip(plotnames, plotids, plotprices)
             for plotname, plotid, plotprice in result:
                 item['plotname'] = plotname
                 item['plotid'] = plotid
                 item['plotprice'] = plotprice
                 yield item
  </code></pre>