0

我有以下 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

7 回答 7

4

您需要跳过第 1 行。它正在尝试将您的列标题从文件解析为 int,但由于它是一个 char 字符串,它会窒息而死。

于 2012-04-17T14:28:39.787 回答
4

该代码尝试处理文件中的每一行,包括hindex. 您正在尝试将此字符串转换为抛出的 int ValueError

要跳过第一行(包含标题),请尝试:

cr = csv.reader(open('C:\\Users\\chatterjees\\Desktop\\data\\topic_hindex.csv', "rb"))
for row in cr[1:]:
    x=row[0]
    if(int(x)<=10):
        print x
于 2012-04-17T14:29:27.987 回答
4

.csv 中的第一行包含无法转换为 int 的内容,因此

    if(int(x)<=10):

以 ValueError 失败。(绝对没有必要将表达式括在()中,顺便说一句。)

您可以跳过 .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

于 2012-04-17T14:31:56.840 回答
2

第一行不能转换为整数。您可以使用块跳过所有行,如第一行try except

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
于 2012-04-17T14:30:14.937 回答
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
于 2012-10-06T07:24:22.117 回答
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]
于 2014-09-14T20:26:10.810 回答
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
于 2012-10-06T07:08:51.080 回答