Как мне записать все эти строки в файл CSV для заданного диапазона?

#python-2.7 #csv #web-scraping

#python-2.7 #csv #веб-очистка

Вопрос:

Целью приведенного ниже кода является поиск в оксфордском словаре английского языка слов, которые были «изобретены» в каждом году в течение ряда лет. Все это работает так, как задумано.

 import csv
import os
import re
import requests
import urllib2

year_start= 1550
year_end = 1552
subject_search = ['Law']

for year in range(year_start, year_end  1):
    path = '/Applications/Python 3.5/Economic'
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
    urllib2.install_opener(opener)

    user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
    header = {'User-Agent':user_agent}

    resultPath = os.path.join(path, 'OED_table.csv')
    htmlPath = os.path.join(path, 'OED.html')
    request = urllib2.Request('http://www.oed.com/search?browseType=sortAlphaamp;case-insensitive=trueamp;dateFilter='  str(year)  'amp;nearDistance=1amp;ordered=falseamp;page=1amp;pageSize=100amp;scope=ENTRYamp;sort=entryamp;subjectClass='  str(subject_search)  'amp;type=dictionarysearch', None, header)
    page = opener.open(request)

    with open(resultPath, 'wb') as outputw, open(htmlPath, 'w') as outputh:
        urlpage = page.read()
        outputh.write(urlpage)

        new_words = re.findall(r'<span class="hwSect"><span class="hw">(.*?)</span>', urlpage)
        print new_words
        csv_writer = csv.writer(outputw)
        if csv_writer.writerow([year]   new_words):
            csv_writer.writerow([year, word])
 

Однако, когда я на самом деле запускаю код, единственная часть, которая записывается в файл csv, — это самый последний год, который я вызываю. Итак, мой csv-файл в конечном итоге выглядит как одна строка, подобная этой:

1552, word1, word2, word3 и т.д….

По сути, я хочу иметь отдельную строку для каждого года в диапазоне лет. Как мне это сделать?

Ответ №1:

Вы продолжаете перезаписывать в цикле, и каждый раз, когда вы запускаете код, открываете его один раз вне циклов и добавляете к открытию файла с a помощью вместо w , поэтому каждый запуск кода будет добавлять к существующим данным, а не перезаписывать.:

 with open("/Applications/Python 3.5/Economic/OED_table.csv", 'a') as outputw, open("/Applications/Python 3.5/Economic/OED.html", 'a') as outputh:     
    for year in range(year_start, year_end  1):
       .....................