2015-02-23 221 views
1
with open('repo-attributes.csv', 'rb') as repofile: 
    reader = csv.DictReader(repofile) 
    for repo in reader: 
     g.add_vertex(name=repo['repository_url'], 
      label=repo['repository_url'][19:], 
      language='(unknown)' if repo['repository_language'] == 'null' 
       else repo['repository_language'], 
      watchers=int(repo['repository_watchers'])) 

這是我的代碼。 我收到如下錯誤。我是python的新手。請好好解釋一下。閱讀csv文件的python錯誤

Traceback (most recent call last): 
    File "C:\Python34\github-network-analysis-master\process.py", line 9, in <module> 
    for repo in reader: 
    File "C:\Python34\lib\csv.py", line 109, in __next__ 
    self.fieldnames 
    File "C:\Python34\lib\csv.py", line 96, in fieldnames 
    self._fieldnames = next(self.reader) 
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?) 
+1

真的錯誤是自我解釋。你用'rb'標誌打開了一個文件,這意味着在讀取二進制模式下打開。你只需要只讀的'r'標誌。 – ljetibo 2015-02-23 14:52:58

+0

使用''rb''是運行Python 2時要做的正確事情;在Python 3中,[module documentation](https://docs.python.org/3/library/csv.html)中的建議是使用''r''和'newline ='''。 – 2015-02-23 15:27:45

+0

也許與此處有關:[如何阻止Python的csv.DictWriter.writerows在Windows中的行之間添加空行?](http://stackoverflow.com/q/22361787) – 2015-02-23 15:34:57

回答

3

刪除b,你打開二進制模式因此bytes錯誤:

with open('repo-attributes.csv', newline="") as repofile: 

實際上,你可以刪除這兩個作爲默認模式是r

+0

OP應該添加'newline ='''以及。請參閱['csv.reader()'文檔](https://docs.python.org/3/library/csv.html#csv.reader)。他們很可能會閱讀關於使用'csv.reader()'和* Python 2 *的文章,其中建議使用''rb''。 – 2015-02-23 15:28:40

+0

@MartijnPieters,在處理DictReader時,我沒有看到與換行符有關的任何東西。 – 2015-02-23 15:31:57

+0

'DictReader()'只是'csv.reader()'的一個包裝。 – 2015-02-23 15:32:24

0

您正在打開的文件在rb意味着read binary請打開它在read模式。將您的代碼更改爲

... 
... 
with open('repo-attributes.csv', 'r')... 
... 
... 

這將在read模式(非二進制)中打開文件。

0

跟蹤的最後一行告訴錯誤首先發生的位置。 由於您以二進制模式打開文件,因此python正在讀取字節。您的文件是csv並以讀模式打開它就足夠了。

所以,而不是rb使用r