Попытка объединить прочитанные данные в цикле Python, но получить ошибку - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь объединить данные, считываемые из текстового файла (единственное число, которое обновляется при повторении цикла), в имя файла. Создание копии файла каждый раз и повторение номера копии. Причина для чтения файла в том, что я хотел бы иметь возможность выбрать, где я остановился, но я продолжаю сталкиваться с этой ошибкой:

TypeError: может объединять только str (не "int") в str

Я пытался переместить оператор str () в несколько разных областей, но, похоже, не нашел места, которое порадует богов Python ... Код следует, и мы смотрим на функцию copy_loop вниз, хотя для полнота я включил все это:

from shutil import copyfile
import time
import tkinter as tk
import threading


class App():
    def __init__(self, master):
        self.isrunning = False

        self.button1 = tk.Button(main, text='start')
        self.button1.bind ("<Button-1>", self.startrunning)
        self.button1.pack()

        self.button2 = tk.Button(main, text='stop')
        self.button2.bind ("<Button-1>", self.stoprunning)
        self.button2.pack()

    def startrunning(self, event=None):
        self.isrunning = True
        t = threading.Thread(target=self.copy_loop)
        t.start()

    def stoprunning(self, event=None):
        self.isrunning = False

    def copy_loop(self):
        read_file = open("loop_counter.txt", "r")
        iteration = read_file.read()
        i = iteration # why can't I make you a string???????!!!!!!!!!!!
        while self.isrunning:
            copyfile("TestFile.docx", "TestFile(" + str(i+1) + ").docx")
            print("File has been duplicated " + str(i+1) + " times.")
            i += 1
            time.sleep(restTime)
            iteration = open("loop_counter.txt", "w")
            iteration.write(str(i))


restTime = int(5)
main = tk.Tk()
app = App(main)
main.mainloop()

Я ценю любую помощь, которую вы можете предложить.

РЕДАКТИРОВАТЬ: Закрытие файла:

    With iteration:
        iteration.write(str(i))
        iteration.close()

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Это просто потому, что i является строкой, а 1 является целым числом в вашем случае. Все, что вам нужно сделать, это использовать str(int(i)+1), чтобы превратить i в целое число, прежде чем сложить с 1, а затем снова изменить целое число на строку.

0 голосов
/ 07 сентября 2018

Ваша проблема не в том, что вы не можете преобразовать i в строку. Дело в том, что она уже является строкой даже до того, как вы попробуете, и поэтому добавление 1 к ней недопустимо.

Во-первых, вы read это из файла. Это всегда возвращает str:

iteration = read_file.read()
i = iteration # why can't I make you a string???????!!!!!!!!!!!

Затем вы пытаетесь добавить 1 к этой строке в нескольких местах, каждое из которых даст вам TypeError:

copyfile("TestFile.docx", "TestFile(" + str(i+1) + ").docx")
print("File has been duplicated " + str(i+1) + " times.")
i += 1

Чтобы исправить это, преобразуйте строку в int сразу после прочтения, например так:

i = int(iteration)

Тогда весь остальной код будет работать, потому что весь остальной код ожидает, что i будет int.

Однако вам следует подумать о том, чтобы упростить его, используя форматирование строк вместо того, чтобы вручную преобразовывать объекты в строки и объединять их. Например, это намного легче читать, и сложнее ошибиться:

copyfile("TestFile.docx", f"TestFile({i+1}).docx")

Или, если вам нужно работать со старыми версиями Python:

copyfile("TestFile.docx", "TestFile({}).docx".format(i+1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...