Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2019, 20:51   #1
[Timur]
Пользователь
 
Регистрация: 03.06.2019
Сообщений: 48
По умолчанию как отправить на сервер txt файл с названием другого файла.

Здравствуйте! У меня есть задача отправить файл на сервер(в определённую переменную заранее сохранив его имя), а затем в другом файле(TXT) отправить его имя. Но у меня отправляется только первый файл, а точнее оба, но второй отправляется пустым!

Кстати, после завершения программы если открыть txt файл с компьютера то в нём то что надо - его имя(имя такое же как и путь(это нормально))

Как сделать чтобы второй файл отправлялся вместе с именем первого?

Вот мой код:

Код:
from ftplib import FTP
import easygui

file = easygui.fileopenbox(filetypes=[])
f = open(file, "rb")
# выполняем вход
ftp = FTP('___СЕКРЕТНО___')
ftp.login('___СЕКРЕТНО___','___СЕКРЕТНО___')
# Открываем католог print на сервере
ftp.cwd('print')            
send = ftp.storbinary("STOR "+ file, f)
f.close()
outtxt = ("text.txt")
filetxt = open(outtxt, "w+")
filetxt.write(file)
print(filetxt)
send2 = ftp.storbinary("STOR "+ outtxt, filetxt)
# Закрываем всё
ftp.close()
filetxt.close()

Последний раз редактировалось Alar; 23.12.2019 в 07:57. Причина: не используйте крупный шрифт
[Timur] вне форума Ответить с цитированием
Старый 22.12.2019, 22:30   #2
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

На сколько я понял, чтобы отправить файл на FTP функцией ftp.storbinary надо, чтобы файл был открыт для чтения. А вы отправляете второй файл из кода, где файл открыт на запись. Поэтому он и пустой на FTP, но не пустой у вас локально, т.к. вы в него все таки произвели запись. Чтобы второй файл отправить нужно просто после создания открыть его заново и вызвать функцию ftp.storbinary как вы делали для первого файла.

Код:
from ftplib import FTP
import easygui


# выполняем вход
ftp = FTP('***')
ftp.login('***','***')
# Открываем католог print на сервере
ftp.cwd('print')

file = easygui.fileopenbox(filetypes=[])

f = open(file, "rb")
send = ftp.storbinary("STOR "+ file, f)
f.close()

outtxt = ("text.txt")
filetxt = open(outtxt, "w+")
filetxt.write(file)
filetxt.close()

f = open(outtxt, "rb")
send2 = ftp.storbinary("STOR "+ outtxt, f)
f.close()

ftp.close()
Ну или так, если немного порефакторить.
Код:
from ftplib import FTP
import easygui

def connect_ftp(host, login, password):
    ftp = FTP(host)
    ftp.login(login, password)
    return ftp

def open_ftp_folder(ftp, folder):
    ftp.cwd(folder)

def open_file_dialog():
    return easygui.fileopenbox(filetypes=[])

def load_file_to_ftp(ftp, file_path):
    with open(file_path, "rb") as f:
        return ftp.storbinary("STOR " + file_path, f)

def save_file(filename, file_text):
    with open(filename, "w") as f:
        f.write(file_text)

ftp = connect_ftp("***", "***", "***")
open_ftp_folder(ftp, "print")
file = open_file_dialog()
load_file_to_ftp(ftp, file)
new_filename = "text.txt"
save_file(new_filename, file)
load_file_to_ftp(ftp, new_filename)

Последний раз редактировалось Arkuz; 22.12.2019 в 23:52.
Arkuz вне форума Ответить с цитированием
Старый 23.12.2019, 08:27   #3
[Timur]
Пользователь
 
Регистрация: 03.06.2019
Сообщений: 48
По умолчанию КРУТО! заработало!

ВСЕ РАБОТАЕТ! Но есть вопрос: Я где то смотрел что W+ это чтение и запись и я поставил этот W+, но как видите он у меня не сработал! ПОЧЕМУ?

Цитата:
Сообщение от Arkuz Посмотреть сообщение
На сколько я понял, чтобы отправить файл на FTP функцией ftp.storbinary надо, чтобы файл был открыт для чтения. А вы отправляете второй файл из кода, где файл открыт на запись. Поэтому он и пустой на FTP, но не пустой у вас локально, т.к. вы в него все таки произвели запись. Чтобы второй файл отправить нужно просто после создания открыть его заново и вызвать функцию ftp.storbinary как вы делали для первого файла.

Код:
from ftplib import FTP
import easygui


# выполняем вход
ftp = FTP('***')
ftp.login('***','***')
# Открываем католог print на сервере
ftp.cwd('print')

file = easygui.fileopenbox(filetypes=[])

f = open(file, "rb")
send = ftp.storbinary("STOR "+ file, f)
f.close()

outtxt = ("text.txt")
filetxt = open(outtxt, "w+")
filetxt.write(file)
filetxt.close()

f = open(outtxt, "rb")
send2 = ftp.storbinary("STOR "+ outtxt, f)
f.close()

ftp.close()
Ну или так, если немного порефакторить.
Код:
from ftplib import FTP
import easygui

def connect_ftp(host, login, password):
    ftp = FTP(host)
    ftp.login(login, password)
    return ftp

def open_ftp_folder(ftp, folder):
    ftp.cwd(folder)

def open_file_dialog():
    return easygui.fileopenbox(filetypes=[])

def load_file_to_ftp(ftp, file_path):
    with open(file_path, "rb") as f:
        return ftp.storbinary("STOR " + file_path, f)

def save_file(filename, file_text):
    with open(filename, "w") as f:
        f.write(file_text)

ftp = connect_ftp("***", "***", "***")
open_ftp_folder(ftp, "print")
file = open_file_dialog()
load_file_to_ftp(ftp, file)
new_filename = "text.txt"
save_file(new_filename, file)
load_file_to_ftp(ftp, new_filename)
ЛУЧШИЙ ОТВЕТ!

Последний раз редактировалось [Timur]; 23.12.2019 в 08:30.
[Timur] вне форума Ответить с цитированием
Старый 23.12.2019, 09:58   #4
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

В документации написано, что файл должен быть открыт в двоичном режиме. Режим "w+" не двоичный режим. Если на чтение или запись, тогда в вашем самом первом коде замените "w+" на "wb+".
Дока - https://docs.python.org/3/library/ftplib.html

Цитата:
FTP.storbinary(cmd, fp, blocksize=8192, callback=None, rest=None)¶
Store a file in binary transfer mode. cmd should be an appropriate STOR command: "STOR filename". fp is a file object (opened in binary mode) which is read until EOF using its read() method in blocks of size blocksize to provide the data to be stored. The blocksize argument defaults to 8192. callback is an optional single parameter callable that is called on each block of data after it is sent. rest means the same thing as in the transfercmd() method.

Последний раз редактировалось Arkuz; 23.12.2019 в 10:07.
Arkuz вне форума Ответить с цитированием
Старый 23.12.2019, 12:57   #5
[Timur]
Пользователь
 
Регистрация: 03.06.2019
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Arkuz Посмотреть сообщение
В документации написано, что файл должен быть открыт в двоичном режиме. Режим "w+" не двоичный режим. Если на чтение или запись, тогда в вашем самом первом коде замените "w+" на "wb+".
Дока - https://docs.python.org/3/library/ftplib.html
Arkuz, Спасибо! Понял!
[Timur] вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отправить на сервер не готовый файл, а, например TJPEGImage или TBitmap? Illusiony Общие вопросы Delphi 4 07.07.2015 19:23
Как отправить файл на сервер через FTP не зная имени, а зная только расширение файла? Самуйлов Э.В. Общие вопросы Delphi 2 03.03.2013 13:15
Отправить файл на сервер Хоттабич C/C++ Сетевое программирование 4 03.03.2012 17:07
[WinAPI] Как отправить файл на сервер? Ёжик в тумане Win Api 4 11.01.2012 01:10
BMP-файл внутри другого файла Pashan Общие вопросы C/C++ 0 08.04.2009 16:37