Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
 Аватар для Badger
95 / 95 / 4
Регистрация: 25.06.2012
Сообщений: 278

Как сохранить файлы с ftp-сервера, формируя пути на основе их имён?

12.08.2013, 11:39. Показов 6215. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, нужна ваша помощь.

На ФТП в каталоге
Code
1
"текущий год"\"текущий месяц"
имеются файлы такого формата:
Code
1
Z2101_to_2113.zip
может быть с маленькой "z" или вместо подчеркивания поставлен пробел, тире, или вообще ничего не быть
Code
1
z2101to2113.zip
Нужно искать в каталоге "за сегодня" все такие файлы и переносить в локальный каталог имя которого будет зависеть от того, что написано в имени файла после to.
То есть
Code
1
Z2101_to_2113.zip
переносим в каталог
Code
1
u:\otd\Запросы\6513\"текущий год"\"текущий месяц"
(переносится число 13, пропуская 2 цифры после to).

Пока вышло только прочитать что находится в каталоге на сервере:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import ftplib
import sys
import os
 
host = '172.189.1.251'
user = 'user'
passwd = 'pass'
 
try:
    ftp = ftplib.FTP(host,user,passwd)                      #Соединение с сервером
    ftp.__class__.encoding = sys.getfilesystemencoding()    #Декодировка текста для правильного отображения русских символов
    ftp.dir('/2013')                                        #Вывод списка файлов в каталоге на ФТП 
#    input("\nPress Enter to exit")
    ftp.close()                                             #Закрыть соединение
except ftplib.error_perm as e:
    print('error:', e)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.08.2013, 11:39
Ответы с готовыми решениями:

Скачать файлы с FTP-сервера и закачать файлы на FTP-сервер
Сдравствуйте, как скачать и закачать файлы на ftp сервер без искажения и повреждения всех расшений, кроме текстовых? К примеру такая...

Как правильно передать и принять файлы на (с) Ftp-сервера?
Как правильно передать и принять файлы на (с) Ftp-сервера?

Как скачать файлы с FTP-сервера по маске и расписанию?
Задача: каждые полчаса соединяться с ФТП сервером (логин, пароль, не пассивный режим), из определенного каталога с кучей файлов скачивать...

5
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
12.08.2013, 12:09
Code
1
2
3
4
5
6
найди файлы
приведи имена к единому виду
для каждого файла
    получи части пути
    сформируй путь
    сохрани файл по нему
1
 Аватар для Badger
95 / 95 / 4
Регистрация: 25.06.2012
Сообщений: 278
12.08.2013, 12:50  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
2 - приведи имена к единому виду
Это невозможно т.к. не я их туда буду бросать, а люди хоть сколько ты им говори все равно будут делать не совсем так как нужно. (а находятся они в районах по всей области. Что еще больше затрудняет с ними контакт.
Есть общая форма записи этих файлов - ZRRNN_to_RRMM.zip, но все равно кто-нибудь да умудрится закинуть файл так как нужно.
Где Z - это (т.н. запрос) неизменяемая буква для этих файлов (может быть большой и маленькой);
RR - две цифры региона откуда выбыл/куда прибыл файл;
NN - две цифры района откуда выбыл файл;
MM - две цифры района куда прибыл файл.

Цитата Сообщение от accept Посмотреть сообщение
1 - найди файлы
Исходя из вышеописанного в голову приходит только поиск файла с помощью регулярных выражений.
Это выражение я вижу так (поправь если не правильно):
Code
1
pattern = 'z21[0-9]+.?to.?[0-9]+\.zip'
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
12.08.2013, 21:42
Цитата Сообщение от Badger Посмотреть сообщение
т.к. не я их туда буду бросать, а люди
у тебя скрипт получает имена, приводит их к одному виду в памяти (чтобы сформировать путь это делается)
если какое-то имя невозможно привести, то для него применяется другой способ обработки (может даже он будет сохраняться по другому пути из-за этого)

у тебя есть список пар (старое имя, новое имя)

из нормального имени выделяешь фрагменты и составляешь путь из этих фрагментов

у тебя есть список пар (путь откуда, путь куда)

Добавлено через 2 минуты
Цитата Сообщение от Badger Посмотреть сообщение
поиск файла с помощью регулярных выражений
они могут понадобиться только на стадии приведения имён
1
 Аватар для Badger
95 / 95 / 4
Регистрация: 25.06.2012
Сообщений: 278
12.09.2013, 16:22  [ТС]
Забыл выложить результат.
Суть программы - добыть с ФТП сервера файлы и разложить по нужным каталогам с текущей датой.
Вот что у меня получилось:
Смотреть...
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# -*- coding: cp866 -*-
 
from ftplib import FTP
import sys, os, re, datetime
 
# Формирование текущего значения года и месяца
now = datetime.datetime.now()
yy = now.year
mm = now.month
dd = now.day
 
# Значение времени для лог-файла [год, месяц, день, час, мин, секунда]
now_time = str(now)
now_time = now_time[:-7]
 
# Функция записи в лог-файл всей информации
def log_all(text):
    logfile = './requests.log'
    file = open(logfile, 'a')
    print('['+now_time+'] ' + text)
    file.write('['+now_time+'] ' + text + '\n')
    file.close()
 
# Функция записи в лог-файл только новых файлов
def log_newfile(text):
    logfile = './new_files.log'
    file = open(logfile, 'a')
    print('['+now_time+'] ' + text)
    file.write('['+now_time+'] ' + text + '\n')
    file.close()
 
# Функция записи ошибок в лог-файл
def log_err(text):
    logfile = './errors.log'
    file = open(logfile, 'a')
    print('['+now_time+'] ' + text)
    file.write('['+now_time+'] ' + text + '\n')
    file.close()
 
# Параметры подклчения к ФТП серверу
host = '172.189.1.251'
user = 'ftpvipl'
passwd = '123'
 
# Соединение с сервером
try:
    ftp = FTP(host,user,passwd)
    ftp.__class__.encoding = sys.getfilesystemencoding()    #Декодировка текста для правильного отображения русских символов
 
    # Добавляем 0 к цифре месяца, если он меньше 10
    if mm < 10: mm = '0%s' % mm
    yy_mm = '%s%s%s%s' % (yy,'/',mm,'/')
    if dd < 10: dd = '0%s' % dd
 
    to_path = 'u:/otd/запити/'                              # Путь куда будут копироваться файлы
    ftp_path = '/all/pens/zapiti/'+yy_mm                    # Путь откуда будут копироваться файлы
    ftp.cwd(ftp_path)                    
 
    # Массив соответствия районов на ФТП сервере
    regions_list = {'6501':6510,'6502':6517,'6503':6503,'6504':6518,'6505':6516,
                    '6506':6506,'6507':6507,'6508':6513,'6509':6502,'6511':6501,
                    '6512':6520,'6513':6505,'6515':6508,'6516':6504,'6517':6509,
                    '6518':6519,'6519':6511,'6521':6512,'6522':6514,'6523':6523}
 
    listing = []
    ftp.dir(listing.append)
    listing_len = len(listing)
    i = 0
    for el in listing:
        if i in range(listing_len):
            words = listing[i].split(None, 8)
            filename = words[-1].lstrip()
            i+=1
 
            pattern = re.compile('(?P<from>[\d]{4}).?to.?(?P<to>[\d]{4})')
            m = pattern.search(filename)
            from_ = m.group('from')
            to_ = m.group('to')
            from_reg = '65' + from_[-2:]
            to_reg = '65' + to_[-2:]
            fFPath = os.path.join(ftp_path, filename)
        
            # Скачиваем файл
            local_filename = os.path.join(to_path, str(regions_list[to_reg])+'/'+yy_mm, filename)
            lf_dir = os.path.dirname(local_filename)
            if not os.path.exists(lf_dir): os.makedirs(lf_dir)      # Создание дерева каталогов, если их не существует
 
            filename_ = filename.split('.')
            if os.path.exists(lf_dir+'/'+filename_[0]+'.ok') or os.path.exists(local_filename):
                log_all(local_filename + ' уже обработан')
            else:
                lf = open(local_filename, "wb")
                ftp.retrbinary("RETR " + fFPath, lf.write, 8*1024)
                log_all(fFPath+' => '+local_filename)
                log_newfile(fFPath+' => '+local_filename)
                lf.close()
 
    # Закрываем соединение
    ftp.close()
# Обработка ошибок и запись в лог-файл
except Exception as err:                                
    log_all(str(err))
    log_err(str(err))
0
0 / 0 / 0
Регистрация: 11.02.2016
Сообщений: 9
11.02.2016, 16:18
Здравствуйте, подскажите как изменить код, чтобы выполнялись следующие действия: так же как и в вашем случае нужно чтобы с фтп скачивались файлы за текущую дату, единственное название файлов имеют следующий вид A36AOFD.771, A36AOFD.772, A36AOFD.773 и т.д. т.п. Заранее благодарен!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.02.2016, 16:18
Помогаю со студенческими работами здесь

Как скачать все файлы в папке FTP сервера?
Как скачать все файлы (если возможно то только формата .png) в папке FTP сервера на ПК?

Как вывести все файлы в определенной папке ftp сервера
string url = &quot;ftp:url/file&quot;; string file = @&quot;C:\file&quot;; wc.DownloadFile(url, file); код работает, все...

Как сохранить дату создания файла при его копировании с FTP-сервера на мой компьютер?
Здравствуйте! @echo echo Делаем файл команд... echo &gt;&gt;cmdftp.txt echo &gt;&gt;cmdftp.txt echo cd /&gt;&gt;cmdftp.txt echo lcd...

Как правильно указать путь к папке на телефоне, куда нужно сохранить файл с FTP-сервера?
Скачиваю файл с FTP по нажатию кнопки в папку на телефоне. Как правильно указать эту папку? button.Click += delegate { ...

Настройка FTP сервера Windows 10.Не удаётся проверить доступ по пути
Доброго времени суток участники форума. Прошу Вас помочь разобраться в чём проблема. Вопрос в следующем, при настройке FTP инструкции по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru