2015-04-06 49 views
3

我确定这已经发布到StackOverflow和Google之间,但我无法找到解决方案,因为我不知道搜索的确切术语。TypeError:必须是字符串,而不是列表

我会尽量做到尽可能具体。我有一堆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. 清理压缩文件只留下重命名的CSV。

我的问题:

  1. 运行我的代码,我给出以下错误必须是字符串,而不是列出。我试图从几个不同的角度来解决这个问题,但无法完全解决这个问题。我知道这不是一回事,但我正在阅读有关C语言中的“类型转换”。有没有类似的东西我可以在这里做?我将获得所有名称的列表并将其导出到一个文本文件并使用它。但是,这感觉像一个肮脏的方式来解决这个问题。

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

我很抱歉,如果我一直不清楚的东西。我会尽力回答任何问题。如果可以帮助,我可以发布我正在处理的整个代码。虽然这并不完美。

SOLUTION:

得到一些方向我能弄清楚如何解决这个之后。我在上面讨论的第二个问题从未成为一个问题。 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 

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

+0

对不起!我应该在那里补充说。是的,那是错误首先发生的地方。 Os.rename想要一个字符串而不是一个列表。 – Corey

+0

可能重复的[TypeError:必须是str,而不是列表](https://stackoverflow.com/questions/30612799/typeerror-must-be-str-not-list) – jww

回答

1

对于os.rename(Extracted[x], "IntendedName.csv")Extracted[0]似乎指向名称列表。如果你想遍历名单,只需要你的任务是Extracted = z.namelist()。当你做Extracted = [z.namelist()]时,它将一个列表包装在一个列表中,所以当你访问0索引元素将其传递给os.rename时,实际上是将一个列表作为第一个参数传入,而不是像预期的那样传递一个字符串。

+0

谢谢你。不过,我最初试图摆脱括号,并在这样做注意到,我得到了“索引超出范围”的错误。调试器告诉我,不是向提取的列表中添加新值,而是实际覆盖“提取”的值。结果是单个文件被正确重命名,然后在第二次迭代中出现索引错误。 – Corey

+0

更多戳绕着解决这个问题。看完你的回答后,我开始更深入地查看列表必须提供的不同选项。我尝试使用“.append”,但无法使其工作。然后我尝试“扩展”并成功运行。我将用工作代码更新我的主要帖子,以备将来参考。 – Corey

0

我相信这个问题是这一行:

Extracted = [z.namelist()] 

我猜namelist()已经返回一个列表,让你把一个列表内的列表。我想你的意思是这个:

Extracted = z.namelist() 
相关问题