Я получаю сообщение об ошибке «[Errno 2] Нет такого файла или каталога» при попытке загрузить файлы с FTP-сервера в фрейм данных Pandas. Файлы находятся в корневом каталоге FTP.
Я предполагаю, что функция pd.read_csv() просматривает мою локальную файловую систему... то есть по локальному пути, где находится скрипт.... Но я не понимаю, как это изменить.
def fetch_files(site, username, password, directory: str = '/', filematch: str = '*.csv'):
with ftplib.FTP(site) as ftp:
# pass the url without protocol
ftp = ftplib.FTP(site)
# pass credentials if anonymous access is not allowed
ftp.login(username, password)
ftp.cwd(directory)
list_ = []
for file_ in ftp.nlst(filematch):
print(file_) # This works
df = pd.read_csv(file_, index_col=None, header=0) # This fails
list_.append(df)
Или мне придется использовать метод ftp.retrlines()? Если да, то в чем разница между параметрами LIST и MLSD?
На заметку: файлы в CSV содержат HTML-код, например &, который отключает массовую вставку SQL. Вот почему я читаю их в фрейме данных, чтобы изменить кодировку и объединить отдельные файлы. Есть ли более быстрый способ сделать это напрямую через модуль Python csv? Думаю, так будет быстрее?
заранее спасибо






Используйте FTP.retrbinary и BytesIO, чтобы загрузить файл в память, а затем передать файлоподобный объект в памяти read_csv:
flo = BytesIO()
ftp.retrbinary('RETR ' + file_, flo.write)
flo.seek(0)
pd.read_csv(flo, ...)
Аналогичный вопрос: Чтение файлов с FTP-сервера в DataFrame в Python
Вышеупомянутый файл загружает весь CSV-файл в память, и только затем он его анализирует. Если вы хотите просмотреть файл по мере его загрузки, для этого, вероятно, потребуется реализовать интеллектуальный пользовательский файлоподобный объект. Что не просто.
На вопрос, который делает что-то подобное, смотрите мой ответ на:
Получите имена файлов внутри zip-файла на FTP-сервере, не загружая весь архив.