【问题标题】:Trying to concatenate read data in Python loop but receiving error尝试在 Python 循环中连接读取数据但收到错误
【发布时间】:2018-09-07 17:40:55
【问题描述】:

我正在尝试将从文本文件中读取的数据(随着循环迭代而更新的单个数字)连接到文件名中。每次都制作文件副本并迭代副本号。读取文件的原因是我希望能够从上次中断的地方继续,但我一直遇到这个错误:

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()

【问题讨论】:

  • 请显示完整的回溯

标签: python python-3.x loops formatting concatenation


【解决方案1】:

你的问题不在于你没有把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))

【讨论】:

  • 太棒了。还有一件事,循环的最后一行是多余的吗?我在哪里写:'iteration.write(str(i))'?抱歉,不知道为什么我的迷你 Markdown 不起作用...
  • @sonofajay 我们只在 cmets 中获得有限的降价。特别是,您可以使用反引号来格式化内联代码片段,但无法编写代码块。
  • @sonofajay 无论如何,我不知道这是否是多余的。如果您尝试编写文件,每次重写文件可能会很有用,这样如果您的程序崩溃,您可以在下次运行时从中断的地方继续。如果您不尝试做类似的事情,那么……我必须知道您为什么要写这些行才能知道它们是否多余。
  • @sonofajay 两个旁注:(1) 重用相同的变量名iteration 来表示两个完全不同的东西是非常令人困惑的——文件的内容在一个地方,然后是一个文件对象文件在另一个。 (2) 不close 你的文件是个坏主意,尤其是你正在写入的文件,尤其是如果你以后可能想在同一个程序中阅读它们。通常你只想使用with 语句来自动处理。
  • 再次感谢。该行的存在与您所说的确切目的相同,但我希望它再次启动程序是否因任何原因崩溃或与计算机一起关闭。我的意思是在写入过程中将 i 变量称为 str 是多余的吗?至于关闭文件,我将添加我认为您的意思作为对操作的编辑,因为块将更易于阅读。
【解决方案2】:

这仅仅是因为 i 是字符串,而 1 在您的情况下是整数。只需要用str(int(i)+1)i转为整数,然后加1,然后再将整个整数转为字符串。

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2020-06-16
    • 2020-08-22
    • 2014-12-21
    相关资源
    最近更新 更多