Преобразовать для цикла, который вызывает различные функции для генератора - PullRequest
0 голосов
/ 06 декабря 2018

Я читаю список CSV, выполняю вычисления и записываю вывод на диск.Набор данных большой (2 ГБ csv на 16 ГБ ОЗУ), расчет дорогой, а объем вывода также большой.Поэтому я хочу использовать генератор;так что я могу написать свой выходной файл по одному.Функции, которые я использовал, большие, поэтому здесь их не вставлять.Я думаю, что генератор с финальным циклом for сделает эту работу.

#read csv with indexing, uecols, dtypes ~ 1 DF is approx 50mb in memory
def reader_1sec_csv(filepath,.....):
    return pd.read_csv(filepath,........)

#processing df
def booleans (dataframe):
    dataframe = dataframe[....]
    ....
    ....
    return dataframe

#processing, row by row operation
def activity (row):
    val = "Unknown"
    ...
    ...
    return val

#apply the functions to a list of filepaths and write to outdir
def csv_to_result (filepath, outdir =".."):
    dataframe = booleans(reader_1sec_csv(filepath))
    dataframe["Activity"] = dataframe.apply(activity, axis=1)
    out = dataframe[["Activity"]]
    out.to_csv(os.path.join(outdir, os.path.splitext(os.path.basename(filepath))[0]+'_A.csv'))

#Can I make this into a generator? Keeping the exceptions list?
exceptions = []
for i in filepaths:
    try:
        csv_to_outcsv(i)
    except:
        exceptions.append(i)
        continue

1 Ответ

0 голосов
/ 07 декабря 2018

Я добавляю список исключений.Поэтому я настроил запуск программы через каждые 5 минут, используя модуль time.Потому что определить все исключения внутри генератора будет нелегко.

exceptions_list = []
def gen_out(paths):

    for i in paths:
        try:
            yield csv_to_outcsv(i)
        except:
            exceptions_list.append(i)
            continue

def periodic_work(interval):
    while True:
        next(gen_out(filepaths)
        time.sleep(interval)
...