Множественные проблемы с созданием текстового файла

#python #text-files

#python #текстовые файлы

Вопрос:

Я создаю свой первый интерфейс с Pyqt, используя «designer» и Python для его настройки.Функция def clickconector возвращает заполнение формы и def radio_value возвращает, если задание находится на рассмотрении или завершено («pendiente» или «terminado»). clickconector и radio_value * функции написаны правильно, но у меня проблемы с def text_file функцией.

Проблема № 1: по какой-то причине сгенерированный файл имеет то же самое, что и заголовок, который появился бы, если radio_value бы функция, поскольку она указывает в алгоритме, что это была другая функция clickconector .

Проблема № 2: заголовок не записывается так, как я хочу. Я получаю это: ('Terminado', 'MT16'). txt , (это написано .txt в названии). Когда это должно быть: Terminado MT16 . Кроме того, тип файла не отображается для меня как .txt , я должен выбрать, чтобы открыть его таким образом с помощью мыши

 def clickconector (self):
    relleno = [self.bitacora.text(), self.turno.text(), self.asesor.text(), self.item.text(), self.modelo.text(), self.identificacion.text(), self.rig.text(),self.horometro.text(),self.condicion.text(),self.orden.text(), self.observacion.text()]
    form_label = ["bitacora", 'turno', 'asesor', 'item', 'modelo', 'identificacion', 'rig', 'horometro', 'condicion', 'orden', 'observacion']
    for a,b in zip (form_label, relleno):
        return (a,b)
        
def radio_value (self):
    if self.pendiente.isChecked():     
        return 'Pendiente' , self.bitacora.text()
    
    if self.terminado.isChecked():
        return'Terminado', self.bitacora.text()

def text_file (self):
    Bloc_title= self.radio_value()
    f = open(str(Bloc_title) '. txt', 'w')
    f.write(str(self.clickconector()))   
    return f       
  

Комментарии:

1. Что вы пытаетесь записать в файл, это всегда будет выбирать первый элемент из relleno и form_label?

2. Это вызвано вызовом функции zip, которая будет по очереди добавлять элементы из массивов, но затем вы выбираете только первый из нового большего массива

3. @User1010 Я хочу записать все сгенерированные элементы в zip, «relleno» и «form_label», но он генерирует только первый, знаете почему?

4. как я должен это исправить? @User1010

5. Я внес изменения в свой ответ

Ответ №1:

Возвращаемый тип radio_value — a tuple . Вы преобразуете кортеж в строку, поэтому он будет напечатан в форме tuple , т. е. "(value_a, value_b, value_c)" и не value_a value_b value_c . Вы можете использовать join для объединения каждого значения кортежа с пробелом, например:

 " ".join(self.radio_value())
  

Вы также написали ". txt" , а не ".txt" f = open(str(Bloc_title) '. txt', 'w') в. Вот почему . txt было указано в имени файла. Имея все это в виду, ваша text_file функция должна выглядеть примерно так:

 def text_file(self):
    filename = f"{' '.join(self.radio_value())}.txt"
    with open(filename, "w") as f:
        f.write(" ".join(self.clickconnector()))
        return f
  

Обратите внимание на использование with/open вместо just open . with/open Настоятельно рекомендуется использовать для удобства чтения и общей простоты использования.

Комментарии:

1. Это не даст желаемого выходного имени файла и оставит запятую

2. @gmdev У меня есть еще один вопрос: в «def clickconector» возвращает только первый кортеж, и я хочу, чтобы все кортежи, я перепробовал много возможных решений, но ошибка та же: TypeError: может присоединиться только к итерируемому. Как я должен исправить эту часть, чтобы иметь данные для обоих списков?

3. Оператор return прерывает цикл for . Вы можете вернуть весь zip-файл, написав: return list(zip(form_label, relleno))

Ответ №2:

Проблема 2,

Пара небольших проблем здесь вы помещаете файл ext так, как . txt это должно быть .txt . Обратите внимание на лишнее пространство.

Ваш Bloc_title список, и поэтому вы получаете массив в заголовке, вам нужно будет добавить дополнительные части этого массива, это всегда будет иметь длину 2, поэтому вы можете сделать следующее,

 def text_file (self):
    Bloc_title = self.radio_value()
    f = open(Bloc_title[0]   ' '   str(Bloc_title[1]   '.txt', 'w')
    f.write(str(self.clickconector()))   
    return f       
  

Обратите внимание, что вызов str может не потребоваться, но я не уверен в типе данных, возвращаемом self.bitacora.text() .

Ответ из комментариев, если вам нужны все элементы из relleno и только первый из form_label, я бы предложил исправить clickconnector()

 def clickconector (self):
    relleno = [self.bitacora.text(), self.turno.text(), self.asesor.text(), self.item.text(), self.modelo.text(), self.identificacion.text(), self.rig.text(),self.horometro.text(),self.condicion.text(),self.orden.text(), self.observacion.text()]
    form_label = ["bitacora", 'turno', 'asesor', 'item', 'modelo', 'identificacion', 'rig', 'horometro', 'condicion', 'orden', 'observacion']
    return [form_label[0]]   relleno
  

Комментарии:

1. Спасибо @User1010! И последний вопрос: если бы я хотел объединить оба списка, чтобы отобразить все элементы, как бы это было?

2. @cfsl Вы можете просто добавить два списка, relleno form_label потенциально используют zip без цикла for

3. Я пытался это сделать, но это не работает, потому что я получаю сообщение об ошибке: TypeError: может присоединиться только к итерируемому. Я новичок в этом и пытаюсь учиться, не могли бы вы помочь мне с этим? Это последнее, что мне нужно