TypeError: Must be String, not list

TypeError: Must be String, not list

我确定这已经 post 在 Whosebug 和 Google 之间的某处编辑,但我无法找到解决方案,因为我不知道要搜索的确切术语。

我将尝试尽可能具体。我有一堆 zip 文件,里面有报告,名称如 Process123456789results.csv。我需要将 CSV 文件重命名为其父 ZIP 文件夹的名称。

所以为了便于理解我需要把这个:

进入这个:

为此我正在使用 ZipFile,我的脚本看起来有点像这样(这里的程序员非常没有经验,所以欢迎所有批评):

Extracted = []
x = 0

for attachment in zip:
with zipfile.ZipFile("IntendedName.zip", "r") as z:
    z.extractall()
    Extracted = [z.namelist()]
    os.rename(Extracted[x], "IntendedName.csv")
os.remove("IntendedName.zip")
x +=1

理想的最终结果是:

  1. 提取 CSV

  2. 将 CSV 重命名为 ZIP 文件名。

  3. 清理 zip 文件,只留下重命名的 CSV。

我的问题:

  1. 运行 我的代码出现以下错误 必须是字符串,而不是列表 。我已经尝试从几个不同的角度来解决这个问题,但无法完全解决这个问题。我知道这不是一回事,但我正在阅读 C 中的 "typecasting"。我可以在这里做类似的事情吗?我打算获取所有名称的列表并将其导出到文本文件并使用它..但这感觉像是一种肮脏的方式来解决这个问题。

  2. 我不知道这是否会成为问题,但使用调试器我可以看到 "Extracted" 的值最终看起来像这样:[u' Process123456789results.csv'] 当从 z.namelist() 调用时 我认为 (未确认)将在修复数字 1 后中断脚本,因为当我尝试重命名文件时,它将无法通过上面的粗体名称而不是 "Process123456789results.csv" 找到文件。是否可以通过删除无关字符来修改列表?这可能只是我想多了。我什至不知道这是否是一个问题,因为我无法通过上述问题。

如果我对某些事情不清楚,我深表歉意。我会尽力回答任何问题。如果有帮助,我可以 post 我正在处理的整个代码。不过,它并不完全漂亮。

解决方案:

在得到一些指导后,我能够弄清楚如何解决这个问题。我在上面第 2 条中谈到的问题从来没有成为问题。第 1 条已由以下一些非常有帮助的人解决。

我在 Shank 的评论中提到的 "index out of error" 问题已通过以下代码解决:

Extracted = []
x = 0

for attachment in zip:
with zipfile.ZipFile("IntendedName.zip", "r") as z:
    z.extractall()
    Extracted.extend(z.namelist())
    os.rename(Extracted[x], "IntendedName.csv")
os.remove("IntendedName.zip")
x +=1

编辑:删除了多余的括号。 再次编辑:添加了一个完整的解决方案。感谢大家的帮助!

我认为问题出在这一行:

Extracted = [z.namelist()]

我猜 namelist() 已经 returns 一个列表,所以您将列表放在列表中。我想你的意思是:

Extracted = z.namelist()

对于os.rename(Extracted[x], "IntendedName.csv")Extracted[0]似乎指向一个名称列表。如果您想遍历名单,只需将您的分配设为 Extracted = z.namelist()。当您执行 Extracted = [z.namelist()] 时,它会将列表包装在列表中,因此当您访问 0 索引元素以将其传递给 os.rename 时,您实际上是将列表作为第一个参数传递,而不是预期的字符串。