Объект 'float' не повторяется

Я написал скрипт, который берет большую таблицу данных Excel и удаляет ненужные столбцы, строки, которые содержат нулевые значения в определенных столбцах, а затем сохраняет их в CSV-файле. Часть, на которой я застрял - я также пытаюсь удалить строки, в которых отсутствуют ячейки. То, как я пытался это сделать, было:

for each_row in row_list :
    if not all(map(len, each_row)) :
        continue
    else :
        UICData.append(row_list)

Но это не работает правильно, так как я получаю сообщение об ошибке:

Файл "/Users/kenmarold/PycharmProjects/sweetCrude/Work/sweetCrude.py",
строка 56, в PrepareRawData
если не все (map(len, each_row)):
Ошибка типа: объект 'float' не повторяется

Я не совсем уверен, как решить эту проблему, как продвигаться вперед в этом? Я также приложил полный скрипт ниже.

#!/usr/bin/env python3
import os
import sqlite3
import csv
import unicodecsv
from datetime import date
from xlrd import open_workbook, xldate_as_tuple
from xlwt import Workbook

orig_xls = 'data/all_uic_wells_jun_2016.xls'
temp_xls = 'data/temp.xls'
new_csv = 'data/gh_ready_uic_well_data.csv'
temp_csv = 'data/temp.csv'

input_worksheet_index = 0             # XLS Sheet Number
output_workbook = Workbook()
output_worksheet = output_workbook.add_sheet('Sweet Crude')
lat_col_index = 13
long_col_index = 14

#### SELECT AND FORMAT DATA

def PrepareRawData(inputFile, tempXLSFile, tempCSVFile, outputFile):

    # 0 = API#              # 7 = Approval Date
    # 1 = Operator          # 13 = Latitude
    # 2 = Operator ID       # 14 = Longitude
    # 3 = Well Type         # 15 = Zone

    keep_columns = [0, 1, 2, 3, 7, 13, 14, 15]

    with open_workbook(inputFile) as rawUICData:
        UICSheet = rawUICData.sheet_by_index(input_worksheet_index)
        UICData = []

        for each_row_index in range(1, UICSheet.nrows - 1, 1):
            row_list = []

            lat_num = UICSheet.cell_value(each_row_index, lat_col_index)     # Get Lat Values
            long_num = UICSheet.cell_value(each_row_index, long_col_index)   # Get Long Values

            if lat_num != 0.0 and long_num != 0.0:      # Find Zero Lat/Long Values

                for each_column_index in keep_columns:
                    cell_value = UICSheet.cell_value(each_row_index, each_column_index)
                    cell_type = UICSheet.cell_type(each_row_index, each_column_index)

                    if cell_type == 3:
                        date_cell = xldate_as_tuple(cell_value, rawUICData.datemode)
                        date_cell = date(*date_cell[0:3]).strftime('%m/%d/%Y')
                        row_list.append(date_cell)
                    else:
                        row_list.append(cell_value)

            for each_row in row_list :
                if not all(map(len, each_row)) :
                    continue
                else :
                    UICData.append(row_list)

            # CreateDB(row_list)  # Send row data to Database

        for each_list_index, output_list in enumerate(UICData):

            for each_element_index, element in enumerate(output_list):
                output_worksheet.write(each_list_index, each_element_index, element)

    output_workbook.save(tempXLSFile)

    #### RUN XLS-CSV CONVERSION

    workbook = open_workbook(tempXLSFile)
    sheet = workbook.sheet_by_index(input_worksheet_index)
    fh = open(outputFile, 'wb')
    csv_out = unicodecsv.writer(fh, encoding = 'utf-8')

    for each_row_number in range(sheet.nrows) :
        csv_out.writerow(sheet.row_values(each_row_number))

    fh.close()

    #### KILL TEMP FILES

    filesToRemove = [tempXLSFile]
    for each_file in filesToRemove:
        os.remove(each_file)
    print("Raw Data Conversion Ready for Grasshopper")

# ---------------------------------------------------
PrepareRawData(orig_xls, temp_xls, temp_csv, new_csv)
# ---------------------------------------------------

3 ответа

Ваш row_list содержит набор значений, например:

[1.01, 75, 3.56, ...]

Когда вы звоните for each_row in row_list:Вы назначаете значение с плавающей точкой each_row для каждой итерации цикла.

Затем вы пытаетесь сделать это:

if not all(map(len, each_row)):

Питона map функция ожидает список в качестве второго аргумента и пытается перебрать его, чтобы применить функцию len для каждого элемента в списке. Вы не можете перебрать поплавок.

Я не совсем уверен, что вы пытаетесь сделать здесь, но если вы хотите проверить, что ни один из предметов в вашем row_list являются None или пустая строка, тогда вы можете сделать:

if None not in row_list and '' not in row_list:
    UICData.append(row_list)

Это грязное пятно.

        for each_row in row_list :
            if not isinstance(each_row, list):
                each_row = [each_row]
            if not any(map(len, each_row)) :
                continue
            UICData.append(row_list)

РЕДАКТИРОВАТЬ: Если any/map/len повышает его до сих пор, то я бы попробовал другой маршрут, чтобы проверить, если он пуст.

Также я не уверен, почему вы добавляете весь row_list, а не текущий ряд. Я изменил это на добавление each_row.

Опция 1

for each_row in row_list:
    if not each_row:
        continue
    UICData.append(each_row)

Option2

keep_data = [arow in row_list if arow] # Or w/e logic. This will be faster.
UICData.append(keep_data)

Похоже, что ваш общий объект - копировать выбранные столбцы из всех строк одного листа файла Excel XLS в файл CSV. Каждая выходная строка должна содержать только действительные ячейки, для некоторого определения "действительный".

Как вы видели, используя map() не очень хорошая идея; это применимо, только если все поля являются текстовыми. Вы должны применять тесты в зависимости от типа данных и, в частности, от отдельного столбца.

После того, как вы проверили элементы в строке, вы можете выводить данные. Вы выбрали путь, который (1) создает список всех выходных строк (2) использует xlwt для записи во временный файл XLS (3) использует xlrd прочитать временный файл и unicodecsv написать файл CSV. Пожалуйста, рассмотрите возможность избежать всего этого; вместо этого просто используйте unicodecsv.writer.writerow(row_list)

Другие вопросы по тегам