【问题标题】:How do I find the row number for a specific item in a CSV file in Python?如何在 Python 中找到 CSV 文件中特定项目的行号?
【发布时间】:2014-03-11 08:48:54
【问题描述】:

我一直在寻找解决方案,但还没有找到。所以,我试图在我的 csv 文件中找到特定输入的行号。例如,假设这是我正在解析的 csv 文件 -

a
b
c
d

这是一个有 100 行和 1 列的文件。所以我输入“d”,我应该得到 4。我试过这段代码,但它给了我 None -

def find_index(input):
    o = open('products.csv', 'rU')
    myData = csv.reader(o)
    index = 0
    for row in myData:
        if row == input:
            return index
        else : index+=1

我是 csv 模块的新手,所以如果我很愚蠢,请原谅我。谢谢!

编辑 - 我尝试了每个人的解决方案,但他们都只返回 None。有什么问题?它是“rU”标志吗?因为如果我删除它,我会收到这个错误 - 对于 myData 中的行:

Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?

【问题讨论】:

  • 根据您报告的错误,听起来您文件中的换行符在某些方面可能不寻常。尝试将整个数据复制到某个文本字段(如 SO 编辑器),然后将其复制回文本编辑器(如记事本)并重新保存。

标签: python excel csv


【解决方案1】:

您正在寻找阅读器对象的line_num 成员:

with open('products.csv') as o:
  myData = csv.reader(o):
  for row in myData:
    if row == input:
       return myData.line_num

重要提示:

请注意is not the same as the number of records returned, as records can span multiple lines. 但是,通常,如果您的记录终止符是换行符,它们将是相同的。如果您需要进一步的帮助,请发表评论。

【讨论】:

  • 因为他们要的是 row 号码,所以我很想建议 for rowno, row in enumerate(myData, 1) 然后返回 rowno... 但是关于 .line_num 的点非常好
  • 老实说,无论谁赞成,这只是机器人投票。这根本没有回答问题。提供的信息还不错,但丝毫不能帮助 OP 克服所述问题。
【解决方案2】:

似乎csv.reader 将每一行作为list 提供给您,因此您需要对该列表进行索引以获取字符串进行比较。

如果您将代码更改为以下内容,您将获得从零开始的索引。

import csv

def find_index(input): 
    o = open('products.csv', 'r') 
    myData = csv.reader(o) 
    index = 0 
    for row in myData:
      #print row
      if row[0] == input: 
        return index 
      else : index+=1
print find_index('d')

如果取消注释print 语句,问题就会变得很明显。

【讨论】:

  • 有趣的是,打印行实际上给了我想要的东西
  • 鉴于 OP 所描述的内容,这就是答案。它与row 不等于input 有关,与“获取行号的更简洁或惯用的方式”无关。
  • 这也给了我 None 作为答案
  • @AdityaBist,请在某处上传您的数据文件。我认为您的文件可能存在格式问题。另外,您使用的是哪个版本的Python
  • @merlin2011,我使用的是 Python 2.7.3。我基本上是复制粘贴你的代码,但它没有给我任何东西。
【解决方案3】:

由于它只有一列,因此您不需要 csv 模块,请尝试以下操作:

with open('products.csv') as f:
   lines = list(i.rstrip() for i in f)

for index,value in enumerate(lines):
    if value == myData:
        print(index)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    相关资源
    最近更新 更多