Попытка преобразовать несколько файлов XLSB в CSV. Не уверен, в чем здесь проблема

import os

import pandas as pd

path = r'C://Users//greencolor//Autoreport//Load_attachments//'
for filename in os.listdir(path):
    if filename.startswith("PB orders"):
        print(filename)                         #until here its working
        month = pd.read_excel(filename, sheet_name="Raw data ", engine="pyxlsb")
        print(month)                            # I get the error here
        month = month[month['Sales Manager'] == 'DEVON, JOHN'] #filtering by manager
        month.to_csv (path + filename + ".csv", index = None, header=True)

Ошибка

FileNotFoundError: [Errno 2] Нет такого файла или каталога: «PB заказывает Dec.xlsb»

Почему я получаю эту ошибку? print(filename) печатает все файлы XLSB, имя которых начинается с заказов PB

0
Greencolor 4 Фев 2022 в 12:36
2
Это означает, что путь к файлу неверен. filename — это просто имя файла, а не полный путь. Вам нужно объединить его с корневым путем, чтобы получить фактический полный путь.
 – 
Panagiotis Kanavos
4 Фев 2022 в 12:38

2 ответа

Лучший ответ

filename — это просто имя файла, а не полный путь. Вам нужно объединить его с path, чтобы получить полный путь к файлу. Вы можете сделать это безопасным способом с помощью os.path.join :

import os
...
for filename in os.listdir(path):
    if filename.startswith("PB orders"):
        full_path = os.path.join(path, filename)
        print(full_path )                         
        month = pd.read_excel(full_path , sheet_name="Raw data ", engine="pyxlsb")

Поиск по шаблону

Альтернативой является использование glob для поиска файлов, соответствующих шаблону. Вам все еще нужно сгенерировать полный путь:

import glob

...

for filename in glob.glob("PB orders*.xlsb", root_dir=path):
    full_path = os.path.join(path, filename)
    print(full_path )                         
    month = pd.read_excel(full_path , sheet_name="Raw data ", engine="pyxlsb")

Избегайте временных файлов

Вам по-прежнему необходимо проверять имя файла, чтобы избежать создания временных файлов, когда кто-то открывает файл Excel (файлы, начинающиеся с ~):

for filename in glob.glob("PB orders*.xlsb", root_dir=path):
    if not os.path.basename(filename).startswith("~"):
        full_path = os.path.join(path, filename)
            print(full_path )                         
            month = pd.read_excel(full_path , sheet_name="Raw data ", engine="pyxlsb")
3
Panagiotis Kanavos 4 Фев 2022 в 12:46
Спасибо, это работает отлично, но как мне изменить последнюю часть, где он преобразуется в CSV?
 – 
Greencolor
4 Фев 2022 в 12:54
В основном я хочу сохранить исходное имя (заказы PB в декабре), но расширение должно быть csv
 – 
Greencolor
4 Фев 2022 в 12:55
Для этого есть несколько ответов, например в этом вопросе. Большинство ответов работают, если имя файла содержит только одну точку. with_suffix pathlib можно использовать для изменения расширения независимо от того, что содержит остальная часть имени файла.
 – 
Panagiotis Kanavos
4 Фев 2022 в 13:04
Нельзя ли сделать с df.to_csv?
 – 
Greencolor
4 Фев 2022 в 13:17

Когда вы делаете month = pd.read_excel(filename, sheet_name="Raw data ", engine="pyxlsb"), попробуйте заменить его на это:

month = pd.read_excel(path + filename, sheet_name="Raw data ", engine="pyxlsb")

Это добавит путь к вашим именам файлов в данном каталоге.

1
neisor 4 Фев 2022 в 12:40