类型错误:必须是字符串,而不是列表。

3
我相信这个问题已经在StackOverflow和Google之间的某个地方发布过,但我无法找到解决方案,因为我不知道要搜索的确切术语。
我将尽可能具体地说明。我有一堆zip文件,里面包含名为Process123456789results.csv的报告。我需要将CSV文件重命名为其父ZIP文件的名称。
因此,为了便于理解,我需要将这个:
IntendedName.zip --> Process123456789results.csv
变成这个:
IntendedName.csv
为了做到这一点,我使用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语言中的“类型转换”。我能不能在这里做类似的事情?我打算获取所有名称并将其导出到文本文件中,然后使用它...但这感觉像是一个肮脏的方式来解决这个问题。

  2. 我不知道这是否会成为一个问题,但是使用调试器,我可以看到“Extracted”的值在被从z.namelist()调用时看起来像这样:[u'Process123456789results.csv'],这可能(未经确认)会在解决第1个问题后破坏脚本,因为当我尝试重命名文件时,它将无法按粗体名称查找文件,而不仅仅是“Process123456789results.csv”。是否可能通过删除多余的字符来修改列表?这可能只是我过度思考了。我甚至不知道是否存在此问题,因为我无法解决上述问题。

如果我对某些事情表达不清楚,我深感抱歉。我会尽力回答任何问题。如果有帮助的话,我可以发布我正在使用的整个代码。它并不完美。
解决方案:
在得到一些指导后,我能够找出如何解决这个问题。下面的一些非常有帮助的人解决了第1个问题。
我在评论中提到的“索引超出错误”问题是通过以下代码解决的:
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

编辑:去掉了冗余的括号。 再次编辑:添加了完整的解决方案。谢谢大家的帮助!


可能是TypeError:必须是str,而不是list的重复问题。 - jww
2个回答

1

对于os.rename(Extracted[x], "IntendedName.csv")Extracted[0] 似乎指向一个名称列表。如果你想要遍历这个名字列表,只需要将赋值语句改为 Extracted = z.namelist()。当你执行 Extracted = [z.namelist()]时,它在列表中再嵌套了一个列表,因此当你访问索引为 0 的元素并将其作为第一个参数传递给 os.rename 时,你实际上传递的是一个列表,而不是该函数期望的字符串。


谢谢您。然而,我最初尝试摆脱括号,在这样做时发现我得到了一个"索引超出范围"的错误。调试器向我展示,它实际上是覆盖了"已提取"列表中的值,而不是添加一个新的值到提取的列表中。结果是一个文件被正确地重命名,然后在第二次迭代时出现索引错误。 - Corey
更深入地探索解决了我的问题。在查看您的答案后,我开始更深入地研究列表提供的不同选项。我尝试使用“.append”,但无法使其正常工作。然后我尝试了“.extend”,并且成功地运行了它。我将更新我的主要帖子,以备将来参考的工作代码。 - Corey

0

我相信问题出在这一行:

Extracted = [z.namelist()]

我猜测 namelist() 已经返回了一个列表,所以你把一个列表放在了另一个列表里。我认为你应该这样做:
Extracted = z.namelist()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接