2015-04-06 68 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() 
相關問題