Как вернуться в начало for-l oop при условии False? - PullRequest
1 голос
/ 13 июля 2020

Я боролся с этим несколько дней и безуспешно исследовал. Я пытаюсь написать функцию, которая

  1. перебирает каталог
  2. открывает файл excel, который соответствует строковому шаблону
  3. открывает файл и ищет специфику c рабочий лист ('импортер')
  4. копирует данные в CSV и продолжает добавлять в CSV, пока все файлы не будут завершены.
  5. Я бы хотел, чтобы функция игнорировала файлы, которые не включите вкладку «импортер» или просто перейдите к следующему файлу в FOR l oop, не выполняя остальную часть («СОЗДАНИЕ ФАЙЛА CSV»).
  6. Создание файла должно происходить только в том случае, если оба имени файла соответствуют шаблону и рабочий лист «импортера» существует. Я чувствую, что близок, но мне нужно немного направления.
def append_all(input_directory):
    for file in os.listdir(input_directory):
        # Qualify if file exist
        if bool(re.search(pattern, file)) == True:
            # Join directory path name to file name
            in_fpath = os.path.join(input_directory, file)
            out_fpath = os.path.join(input_directory, 'history.csv')
            wrkbk = xlrd.open_workbook(in_fpath)
            if wrkbk.sheet_names() == 'importer':
                wrksht = wrkbk.sheet_by_name('importer')
                # Handling excel refresh date value to be used to populate csv file
                refresh_date_float = wrksht.cell_value(1, 4)
                refresh_date_value = xlrd.xldate_as_datetime(refresh_date_float, wrkbk.datemode).strftime(
                    '%Y/%m/%d %H:%M')
                # else:
                # continue

                # CSV FILE CREATION
                # Qualify if file exist. Default returns TRUE
                if os.path.isfile(out_fpath) == False:
                    # os.mkdir(output_directory)
                    # file will be created if it does not exist
                    with open(out_fpath, 'w', newline='') as csvfile:
                        wr = csv.writer(csvfile)
                        # start row index 3 to skip unecessary data
                        for rownum in range(3, wrksht.nrows):
                            # wr.writerow(wrksht.row_values(rownum) + list(refresh_date_value))
                            wr.writerow(list(wrksht.row_values(rownum)) + [refresh_date_value])
                            # Start append data
                else:
                    with open(out_fpath, 'a', newline='') as csvfile:
                        wr = csv.writer(csvfile)
                        # start row index 4 to skip header row
                        for rownum in range(4, wrksht.nrows):
                            # wr.writerow(wrksht.row_values(rownum)  + list(refresh_date_value))
                            wr.writerow(list(wrksht.row_values(rownum)) + [refresh_date_value])


csvfile.close()
print('process complete')

1 Ответ

0 голосов
/ 13 июля 2020
  • Используйте .rglob из модуля pathlib, чтобы найти файлы с указанным шаблоном.
    • Это похоже на вызов Path.glob() с '**/', добавленным перед заданным относительным шаблоном.
    • Модуль pathlib предлагает классы, представляющие пути файловой системы с семантикой подходит для разных операционных систем.
  • Будет намного проще использовать pandas.read_excel, используя параметр sheet_name внутри try-except блок.
    • Блок try-except попытается загрузить файл с именем рабочего листа. Если рабочий лист отсутствует, произойдет исключение. В этом случае, если есть исключение, скрипт перейдет к следующему файлу go.
  • Объедините все файлы в один фрейм данных, используя pandas.concat, а затем сохраните его в CSV с помощью .to_csv.
from pathlib import Path
import pandas as pd

p = Path('c:/.../path_to_files')  # path to files

files = list(p.rglob('*.xlsx'))  # get all xlsx files that match the pattern

list_of_dataframes = list()  # list to add dataframe to
for file in files:
    try:
        list_of_dataframes.append(pd.read_excel(file, sheet_name='importer'))  # add dataframe from Excel file to list
    except XLRDError:  # exception because there's not importer worksheet
        print(f'{file} did have the "importer" worksheet')
        
df = pd.concat(list_of_dataframes)  # combine the dataframes from all the files

df.to_csv('my_combined_files.csv', index=False)  # save to a csv

В качестве функции

def create_csv_from_multiple_xlsx_files(path_to_files: str, filename_pattern: str, save_name: str):
    
    p = Path(path_to_files)  # convert to pathlib object

    files = list(p.rglob(filename_pattern))  # get all xlsx files that match the pattern

    list_of_dataframes = list()  # list to add dataframe to
    for file in files:
        try:
            list_of_dataframes.append(pd.read_excel(file, sheet_name='importer'))  # add dataframe from Excel file to list
        except XLRDError:  # exception because there's not importer worksheet
            print(f'{file} did have the "importer" worksheet')

    df = pd.concat(list_of_dataframes)  # combine the dataframes from all the files

    df.to_csv(f'{save_name}.csv', index=False)  # save to a csv
    
    
top_level_file_dir = 'c:/.../path_to_files'  # path to files
pattern = '*.xlsx'  # filename pattern
csv_file_name = 'my_combined_files'
create_csv_from_multiple_xlsx_files(top_level_file_dir, pattern, csv_file_name)  # call function
...