2012-04-17 75 views
0

我有以下csv文件:CSV操縱

hindex 
1 
2 
2 
6 
3 
3 
3 
2 
2 

我想讀該行並檢查它的價值,但它提供了以下錯誤:

ValueError: invalid literal for int() with base 10: 'hindex' 

的代碼是:

cr = csv.reader(open('C:\\Users\\chatterjees\\Desktop\\data\\topic_hindex.csv', "rb")) 
for row in cr: 
    x=row[0] 
    if(int(x)<=10): 
     print x 

我的代碼有什麼問題?

回答

4

您需要跳過第1行。它試圖將您的列標題從文件解析到int中,但由於它是char字符串,因此它正在窒息和死亡。

+0

你會建議跳過行?我做舊時尚變量'我'並增加它 – codious 2012-04-17 14:31:29

+0

@codious,我已經提出了一些exapmle代碼跳過該行。 – cmh 2012-04-17 14:31:55

+1

@codious正如一個筆記,如果你使用計數(這不是最好的方式,因爲其他答案已經指出),那麼而不是做一個變量,並增加它,更好的選擇[''enumerate()' '](http://docs.python.org/library/functions.html#enumerate) - 例如:''爲數字,在枚舉行(cr):''。 – 2012-04-17 14:34:54

4

該代碼嘗試處理文件中的每一行,包括hindex。您正在嘗試這個字符串轉換到投ValueError一個int:

要跳過第一行(包含頭)嘗試:

​​
+0

非常感謝。學習python如此神奇以學習這些簡單的技巧。 – codious 2012-04-17 14:32:49

+4

'cr [1:]'讀取*整個文件*以刪除一行。如果它是一個大文件,它會吃掉大量的內存。更好的方法是調用'next(cr)',然後在下一行上執行'in cr:'中的行。 – 2012-04-17 14:53:23

+0

啊,好點。 – cmh 2012-04-17 14:57:43

2

第一行不能轉換成整數。

cr = csv.reader(open('C:\\Users\\chatterjees\\Desktop\\data\\topic_hindex.csv', "rb")) 
for row in cr: 
    x=row[0] 
    try: 
    if int(x) <= 10: 
     print x 
    except ValueError: 
    pass 
+0

非常感謝。嘗試抓取建議+1。 – codious 2012-04-17 14:33:11

+0

幾乎給+1,但請使用'除了ValueError:' – Aprillion 2012-06-20 19:23:08

+0

我做到了!謝謝你的糾正! – 2012-06-22 12:19:46

4

在.csv你的第一行包含一些東西,不能轉換爲int,所以

if(int(x)<=10): 

失敗:您可以通過使用一個try except塊跳過所有像第一個行一個ValueError。 (也絕對沒有必要在封裝(表達),順便說一句。)

可以eighter跳過該.csv的第一線,或包裹int(x) 成try/catch塊,像這樣:

for row in cr: 
    x=row[0] 
    try: 
     x=int(x) 
    except ValueError: # x cannot be converted to int 
     continue  # so we skip this row 
    if x<=10: # no need for parens here 
     print x 

瞭解更多關於異常和處理那些在這裏:http://docs.python.org/tutorial/errors.html

+0

感謝一個稍微不同的方法。 – codious 2012-04-17 14:38:34

+0

雖然這與給定的示例文件效果很好,但如果您嘗試處理其他文件,則此方法很容易導致悲傷。考慮一個情況,一個CSV文件被傳遞給你的程序在其他行中包含非數字值。程序會高高興興地忽略它們,繼續下一行,而不是用'ValueError'失敗,從而拒絕這個文件並指出用戶應該傳遞一個合適的文件。 – roskakori 2012-10-06 06:54:14

1

下面是隻跳過第一和第一行的情況下,失敗ValueError任何其他行包含非數值的解決方案。它通過使用內置的enumerate()函數來實現,該函數保持處理的行數。此外,使用with聲明完成輸入文件時,它會正確關閉輸入文件。

import csv 
with open('C:\\Users\\chatterjees\\Desktop\\data\\topic_hindex.csv', 'rb') as csvFile: 
    for rowNumber, row in enumerate(csv.reader(csvFile)): 
     if rowNumber > 0: 
      x = row[0] 
      if int(x) <= 10: 
       print x 
2

相當令人驚訝的沒有人提到csv.DictReader,因爲它是真正跳過標題行獲得的數據在一個不錯的字典格式最簡單的方法:在這裏

import csv 
with open('C:\\Users\\chatterjees\\Desktop\\data\\topic_hindex.csv', "rb") as f: 
    cr = csv.DictReader(f) 
    for row in cr: 
     x = row['hindex'] 
     if int(x) <= 10: 
      print x 
1

只是多了一個選擇。我寫了一個可以輕鬆處理這個任務的包裝庫。假設您已將數據保存在以下腳本所在的目錄中名爲「topic_hindex.csv」的文件中。

import pyexcel 


r = pyexcel.SeriesReader("topic_hindex.csv") 
for row in r.rows(): 
    x = row[0] 
    if x <= 10: 
     print x 

或者,您可以使用過濾器:

import pyexcel 


r = pyexcel.SeriesReader("topic_hindex.csv") 
eval_func = lambda row: row[0] <= 10 
r.filter(pyexcel.RowValueFilter(eval_func)) 
for row in r.rows(): 
    print row[0]