"[WinError 10054] Существующее соединение было принудительно закрыто удаленным хостом".
Это происходит примерно в одном и том же месте в папках FTP. Я полагаю, что это как-то связано с тем, что команда RETR в конечном итоге блокирует FTP?
Я пробовал команду сна, фрагментацию и т. д. Это сработало без использования io.BytesIO, но мне нужен ftp метаданные из CSV-файлов, находящихся внутри заархивированных файлов. Я бы предпочел не загружать файлы, а загружать их в память, поэтому я применил этот подход. Если будет оптимально загрузить его, я пересмотрю свое решение. Я также видел варианты временной загрузки заархивированных файлов и последующего удаления папок. Я просто не уверен, сколько времени займет этот процесс. Мне нужно обработать много файлов.
В моем примере структура папок выглядит примерно так:
202404 -> My_Project-(20240412-20240412)-20240413.zip - > Мой_проект-(20240412-20240412)-20240413.csv
У меня много папок по годам и месяцам, и в каждой из этих папок есть zip-папки на каждый день. И затем внутри каждого из этих zip-архивов находится CSV-файл.
Это моя функция обработки zip-файлов:
Код: Выделить всё
def process_zip_and_get_data(ftp, zip_name, allowed_report_types):
results = []
# Open the ZIP file from the stream and list its contents
try:
# Stream ZIP file data into memory
zip_stream = io.BytesIO()
logger.info(f"Streaming ZIP file: {zip_name}")
ftp.retrbinary(f"RETR {zip_name}", zip_stream.write, blocksize=8192)
# Reset stream position
zip_stream.seek(0)
with zipfile.ZipFile(zip_stream) as zip_ref:
for zip_info in zip_ref.infolist():
if zip_info.filename.endswith('.csv'):
# Regex to match files
file_name_pattern = re.compile(
r'^(?P[A-Za-z0-9\-_]+)-\((?P\d{8})-
(?
P\d{8})\)-(?P\d{4}-\d{2}-
\d{2})_.*\.csv')
match = file_name_pattern.fullmatch(zip_info.filename)
if match:
report_type = match.group("report_type")
# Skip files if the report_type is not in the allowed list
if allowed_report_types and report_type not in
allowed_report_types:
logger.info(f"Skipped file due to disallowed report type:
{zip_info.filename}")
continue
results.append ({
"file_name": zip_info.filename,
"report_type": match.group("report_type"),
"ftp_upload_date": datetime(*zip_info.date_time).date(),
"file_date_from":
datetime.strptime(match.group("file_date_from"),
"%Y%m%d").date(),
"file_date_to":
datetime.strptime(match.group("file_date_to"),
"%Y%m%d").date(),
"file_date_upload": match.group("file_date_upload"),
"size": zip_info.file_size,
"status": "Incomplete"
})
else:
logger.warning(f"Skipped subfolder: {zip_info.filename}")
except Exception as e:
logger.error(f"Error processing ZIP file {zip_name}: {e}")
return results
но я бы предпочел получать фактические метаданные изнутри CSV .
Подробнее здесь: https://stackoverflow.com/questions/793 ... ith-python