TypeError:必须是String,而不是list

时间:2015-04-06 19:21:20

标签: python list formatting output

我确定这已经发布在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。

  4. 我的问题:

    1. 运行我的代码我收到以下错误必须是字符串,而不是列表。我试过从几个不同的角度接近这个但是不能完全解决这个问题。我知道这不是一回事,但我正在阅读C中的“类型转换”。我能在这里做类似的事吗?我将获得所有名称的列表并将其导出到文本文件并使用..但这感觉就像是一种解决这个问题的方法。

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

    3. 如果我不清楚某事,我道歉。我会尽力回答任何问题。我可以发布我正在处理的整个代码,如果有帮助的话。但这并不完美。

      SOLUTION:

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

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

      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
      

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我认为问题在于这一行:

Extracted = [z.namelist()]

我猜测namelist()已经返回了一个列表,所以你要在列表中放一个列表。我认为你的意思是:

Extracted = z.namelist()