Метод класса интерфейса не сохраняется файл в выбранную папку

Рейтинг: 0Ответов: 2Опубликовано: 02.05.2023

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

# принятие ответа сервера
    def recv_msg(self):
        data = self.sock.recv(10240)
        data = pickle.loads(data, encoding='utf-8')
        rep_file = data.to_csv('report_df.csv', index=False)
        target_fld = self.get_folder()
        os.path.join(str(target_fld), rep_file)
        print('file upload')
        self.sock.close()

Вот весь код в модуле:

import sys
import os
import socket
import pickle
from PyQt6 import QtWidgets
from PyQt6.QtWidgets import QApplication
from upload_client_gui import Ui_MainWindow

class gui(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.connect(('localhost', 9090))

        self.download_folder = None
        self.ui.pushButton.clicked.connect(self.get_folder)
        self.ui.pushButton_2.clicked.connect(self.send_msg)

    # выбор даты выгружаемого отчета 
    def calendar_date(self):
        date = self.ui.calendarWidget.selectedDate()
        string_date = str(date.toPyDate())
        return string_date

    # открывается проводник для выбора папки в которую будет сохраняться файл
    def get_folder(self):
        try:
            self.download_folder = QtWidgets.QFileDialog.getExistingDirectory(self, 'Выберете папку для сохранения')
            os.chdir(self.download_folder)
            print(self.download_folder)
        except:
            pass

    # отправка даты на сервер через сокет
    def send_msg(self):
        msg = self.calendar_date()
        print(msg)
        self.sock.send(msg.encode('utf-8'))

    # принятие ответа сервера
    def recv_msg(self):
        data = self.sock.recv(10240)
        data = pickle.loads(data, encoding='utf-8')
        rep_file = data.to_csv('report_df.csv', index=False)
        target_fld = self.get_folder()
        os.path.join(str(target_fld), rep_file)
        print('file upload')
        self.sock.close()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = gui()
    win.show()
    sys.exit(app.exec())

Выбор папки работает, возвращается абсолютный путь, запрос и ответ сокета тоже есть.

Помогите пожалуйста разобраться где у меня проблема.

Ответы

▲ 0Принят

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

import sys
import os
import socket
import pickle
from PyQt6 import QtWidgets
from PyQt6.QtWidgets import QApplication
from upload_client_gui import Ui_MainWindow

class Gui(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.connect(('localhost', 9090))

        self.download_folder = None
        self.ui.pushButton.clicked.connect(self.get_folder)
        self.ui.pushButton_2.clicked.connect(self.send_msg)

    # выбор даты выгружаемого отчета
    def calendar_date(self):
        date = self.ui.calendarWidget.selectedDate()
        string_date = str(date.toPyDate())
        return string_date

    # открывается проводник для выбора папки в которую будет сохраняться файл
    def get_folder(self):
        try:
            self.download_folder = QtWidgets.QFileDialog.getExistingDirectory(self, 'Выберете папку для сохранения')
            self.download_folder = self.download_folder.replace('/', '\\') + '\\'
        except:
            pass

    # отправка даты на сервер и прием информации с сервера через сокет
    def send_msg(self):
        msg = self.calendar_date()
        self.sock.send(msg.encode('utf-8'))

        data = self.sock.recv(10240)
        data = pickle.loads(data, encoding='utf-8')
        try:
            target_fld = self.download_folder
            data.to_csv(os.path.join(str(target_fld), 'report_df.csv'), index=False)
            self.sock.close()
        except Exception as e:
            print(e)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Gui()
    win.show()
    sys.exit(app.exec())
▲ 0

возможно ошибка в буфере -> 1024->(0)<-

socket.recv(10240)будет считывать не более 10240 байт, блокируя, если нет данных, ожидающих чтения.

socket.recv также будет заканчиваться пустой строкой, если соединение будет закрыто или возникнет ошибка и вы ничего не узнаете о неполадках. короче, дынные отправлены, но их размер невелик, а буфер не забит. попробуй изменить размер буфера.