Добавить параметры в сокращение для цикла в Python - PullRequest
0 голосов
/ 29 мая 2018

Мне очень жаль, что я не смог дать лучший заголовок для моей проблемы.Я очень новичок в программировании на Python, и мне нужно внести небольшие изменения в существующий код в приложении.Текущий код Python считывает каждую строку и каждый столбец в листе Excel и сохраняет его в том виде, в котором он находится в БД, в таблице с именем «Commits».БД, которую мы используем, - это SQL Lite, а библиотека Python, которую мы используем для этого, - sqlite3.py. В существующем коде в БД вставлено только 6 столбцов, как в листе Excel.Ниже приведен код для него: -

def constructjenkinsdata(filepath):
    return [(jenkinsentry[0], jenkinsentry[1], jenkinsentry[3],jenkinsentry[2],jenkinsentry[4],jenkinsentry[5],str(dateparser.parse(jenkinsentry[6],ignoretz=True)),jenkinsentry[7]) for jenkinsentry in csvrowgenerator(filepath)]

def loadjenkinsdata(jenkinssource, concurrency=3):
    p = Pool(concurrency)
    jenkinsdataset_lists = p.map(constructjenkinsdata, jenkinssource)
    jenkinsdataset = list(chain.from_iterable(jenkinsdataset_lists))
    persistjenkinsdata(jenkinsdataset, batchid)

В приведенном выше коде persistjenkinsdata - это функция, которая просто передает запрос вставки в БД для вставки набора данных.

FOllowing - это кодcsvrowgenerator: -

def csvrowgenerator(filepath):
with open(filepath, encoding="utf8") as f:
     for row in csv.reader(f):
         yield row

Теперь мое требование состоит в том, чтобы при чтении каждого столбца в таблице Excel мы передавали второй столбец в качестве входных данных для запроса Select Join, который будет возвращать набор из двух столбцов и каждогоЗначение столбца должно быть передано в вышеупомянутую коллекцию цикла с короткими руками для вставки его в БД.

Я написал функцию, которая возвращает соответствующие значения после извлечения значений из БД, эта функция возвращаетвывод правильно, когда я передаю статический вход.Но я не знаю, как динамически передавать входные данные из цикла for в эту функцию.Как изменить строки кода ниже, чтобы включить еще два параметра для передачи в набор данных.Что мне нужно, так это: - return [(jenkinsentry [0], jenkinsentry [1], jenkinsentry [3], jenkinsentry [2], jenkinsentry [4], jenkinsentry [5], str (dateparser.parse (jenkinsentry [6]], ignoretz = True)), jenkinsentry [7], {Value-1 возвращается из БД, ввод - jenkinsentry [2]}, {Value-2 возвращается из DB, ввод - jenkinsentry [2]}) для jenkinsentry в csvrowgenerator(filepath)]

Я очень плохо знаком с python, поэтому я не знаю, как изменить эту короткую руку для циклов, чтобы соответствующим образом изменить коллекцию.Я попробовал следующее: -

def constructjenkinsdata(filepath):
    columns = []
    for jenkinsentry in csvrowgenerator(filepath):
      buildNo = jenkinsentry[0]
      #print('Build NO .. ' + buildNo)
      columns.append(buildNo)
      url = jenkinsentry[1]
      columns.append(url)
      #print('URL....'+url)
      testCaseName = jenkinsentry[2]
      columns.append(testCaseName)
      className = jenkinsentry[3]
      columns.append(className)
      crid = jenkinsentry[4]
      columns.append(crid)
      errorDetails = jenkinsentry[5]
      columns.append(errorDetails)
      createTime = str(dateparser.parse(jenkinsentry[6],ignoretz=True))
      columns.append(createTime)
      print('Create time.....' + str(createTime))
      status = jenkinsentry[7]
      columns.append(status)
      print('Test Case Name....' + testCaseName)
      lastFailedBuildIDAndCreateTime = returnbuildIDAndCreatedateSet(testCaseName)
      lastFailedBuildID = str(lastFailedBuildIDAndCreateTime[0])
      print('Last Failed build ID .....' + str(lastFailedBuildID))
      columns.append(lastFailedBuildID)
      lastFailedCreateTimeString = str(lastFailedBuildIDAndCreateTime[1])
      columns.append(lastFailedCreateTimeString)
      print('Last Failed Create Time .....' + str(lastFailedCreateTimeString))
      #jenkinsColumnCollection.append(columns)
      return columns

Но приведенный выше код выполняется только один раз и не выполняет итерацию по всем элементам в строке.Когда я пытаюсь использовать yield вместо return.Это выдает ошибку в следующей строке: - jenkinsdataset = list (chain.from_iterable (jenkinsdataset_lists))

Ниже приведен вывод оператора print, который возвращается из моего кода цикла For: -

набор данных jenkins. Первый элемент .... [['922', 'sdsadad', 'Test Suite Hooks', 'Test Suite Hooks', '', '', '2018-05-23 01:00:00 ',' pass ',' None ',' None ']]

Ниже показано, как формируется вывод с фактическим кодом возврата "[(jenkinsentry [0], jenkinsentry [1], jenkinsentry [3], jenkinsentry [2], jenkinsentry [4], jenkinsentry [5], str (dateparser.parse (jenkinsentry [6], ignoretz = True)), jenkinsentry [7]) дляjenkinsentry в csvrowgenerator (filepath)] "

набор данных jenkins .. Первый элемент .... [[('922', 'sdsadad', 'Hooks комплектов тестов', 'Hooks комплектов тестов', '', '', '2018-05-23 01:00:00', 'pass', '', ''), ('922', 'sdsadad', 'abc / ssdsd', 'Quebjhfghjhdg aeuyruyiyd', '', '', '2018-05-23 01:00:00', 'pass', '', ''), ('922', 'sdsadad', 'abc / ssdsd', 'Quebjhfghjhdg aeuyruyiyd ',' ',' ',' 2018-05-23 01:00:00 ',' pass ',' ',' ')]]

Пожалуйста, помогите мне сформировать коллекцию, который получает данные из существующего цикла for и корректно анализируется в списке (chain.from_iterable (jenkinsdataset_lists))

1 Ответ

0 голосов
/ 29 мая 2018

Давайте посмотрим на ваш код

def constructjenkinsdata(filepath):
    columns = []
    for jenkinsentry in csvrowgenerator(filepath):
      ...
      return columns

Вы return columns в конце вашей первой итерации.Должно быть:

def constructjenkinsdata(filepath):
    columns = []
    for jenkinsentry in csvrowgenerator(filepath):
       ...
    return columns
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...