2012-10-10 85 views
0

我想讀取.csv文件中的一串數據,格式爲: [[a,b,c,d],[e,f,g,h],...]如何正確讀取csv並將其輸入到列表中?

運行下面的代碼時,當我用空格('')打印條目時,我訪問元素的方式不正確,因爲它停在第一個空格('')。 例如,如果業務,快速公司,YouTube上,fastcompany是第10項...當我打印下面我得到不同的行: 業務,快速 公司,YouTube上,FastCompany

如何獲得任何意見結果:[[a,b,c,d],[商業,快速公司,Youtube,fastcompany],[e,f,g,h],...]?

import csv 

partners = [] 
partner_dict = {} 
i=9 
with open('partners.csv', 'rb') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
    for row in spamreader: 
     partners.append(row) 

    print len(partners) 

    for entry in partners[i]: 
     print entry 
+0

,那麼您已經指定的分隔爲「」,所以你能指望什麼?你能顯示文件的幾行嗎? –

+0

您需要用您提供的報價字符引用您的字符串。例如。 '|商業,快速公司,Youtube,fastcompany |' – Dunes

回答

2

delimiter參數指定使用哪個字符將文件的每一行分隔爲不同的值。既然你通過''(空間),讀者正在分裂空間。

如果這實際上是一個逗號分隔的文件,請使用','作爲分隔符(或者只保留delimiter參數,它將默認爲',')。

此外,管道字符是引號字符的不尋常值。你的輸入文件是否包含管道而不是引號?您提供的樣本數據既不包含管道也包含報價。

0

有你的代碼的幾個問題:

  • 「正確」的語法遍歷一個列表for entry in partners:,不for entry in partners[i]:
  • 在你的代碼的partners_dict變量似乎是未使用的,我承擔以後你會使用它,所以我會忽略它
  • 你打開一個文本文件作爲二進制(使用open(file_name, "r")代替open(file_name, "rb")
  • 你所處理的數據的處理仍然是內部完成上下文管理器(with ... [as ...]: - 阻塞)
  • 你輸入的文字似乎被", "界定,但您可以通過" "解析

的時候如果我明白你的問題就在您的問題似乎是最後一個引起來分隔。 「明顯的解決方案」可能是將delimeter參數更改爲", ",但模塊只允許單字符串作爲分隔符。那麼我們該怎麼辦?那麼,因爲","確實是「真正的」分隔符(它不應該在實際未加引號的數據中,與空格相反),這似乎是一個很好的解決方案。但是,現在所有的值都以" "開頭,這可能不是您想要的值。所以你會怎麼做?那麼,所有的字符串都有一個非常整潔的方法,它默認會刪除字符串開頭和結尾的所有空格。因此,對於strip()的所有值,讓我們使用「list comprehension」(評估列表中所有項目的表達式,然後返回帶有新值的新列表),它應該看起來有點像[i.strip() for i in row],然後再附加到partners

到底你的代碼應該有希望看起來有點像這樣:

import csv 

partners = [] 

with open('partners.csv', 'r') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=',', quotechar='|') 
    for row in spamreader: 
     partners.append([i.strip() for i in row]) 

print len(partners) 

for entry in partners: 
    print entry 
相關問題