【问题标题】:TypeError: Must be String, not listTypeError:必须是字符串,而不是列表
【发布时间】:2015-06-11 06:04:06
【问题描述】:

我确定这已经发布在 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”的值最终看起来像这样:[u'Process123456789results.csv'] 当从 z.namelist() 调用它时,我认为(未确认)会在编号 1 被修复后破坏脚本,因为当我尝试重命名文件时,它会无法通过上面的粗体名称找到文件,而不仅仅是“Process123456789results.csv”。是否可以通过删除无关字符来修改列表?这可能只是我想多了。我什至不知道这是否是一个问题,因为我无法通过上述问题。

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

解决方案:

在获得一些方向之后,我能够弄清楚如何解决这个问题。我在上面第 2 点中谈到的问题从未成为问题。第 1 点由以下一些非常有帮助的人解决。

我在对 Shank 的 cmets 中提到的“索引错误”问题已通过以下代码解决:

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

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

【问题讨论】:

标签: python list formatting output


【解决方案1】:

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

【讨论】:

  • 谢谢你。但是,我最初尝试摆脱括号并在这样做时注意到我遇到了“索引超出范围”错误。调试器告诉我,它实际上是覆盖“已提取”的值,而不是向提取的列表添加新值。结果是一个文件被正确重命名,然后在第二次迭代时出现索引错误。
  • 更多的探索为我解决了这个问题。在查看您的答案后,我开始更多地研究列表必须提供的不同选项。我尝试使用“.append”,但无法让它工作。然后我尝试了“.extend”,它成功了。我将使用工作代码更新我的主要帖子以供将来参考。
【解决方案2】:

我认为问题出在这一行:

Extracted = [z.namelist()]

我猜namelist() 已经返回了一个列表,所以您将一个列表放入列表中。我认为您的意思是:

Extracted = z.namelist()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多