【问题标题】:How can I get a specific field of a csv file?如何获取 csv 文件的特定字段?
【发布时间】:2011-08-11 02:14:57
【问题描述】:

我需要一种方法来获取 CSV 的特定项目(字段)。假设我有一个 100 行 2 列(逗号分隔)的 CSV。第一列电子邮件,第二列密码。例如,我想在第 38 行获取电子邮件的密码。所以我只需要第 2 列第 38 行的项目...

假设我有一个 csv 文件:

aaaaa@aaa.com,bbbbb
ccccc@ccc.com,ddddd

例如,我怎样才能只获得“ddddd”?

我是这门语言的新手,尝试了一些关于 csv 模块的东西,但我不明白...

【问题讨论】:

  • @ThiefMaster:你的编辑正确吗?首先,OP 似乎想要一行的最后一个术语......否则这个问题很难理解:OP 是否想要 csv 文件中最后一个逗号之后的最后一个字符串?
  • @joaquin:我所做的只是将??? 替换为?。约翰的编辑只是添加了代码格式(问题的代码之前已经有两行)所以我很确定它是。
  • 文件是电子邮件,每行密码,例如第一列电子邮件,第二列密码。例如,我只想获取第二行的密码

标签: python csv


【解决方案1】:
import csv
mycsv = csv.reader(open(myfilepath))
for row in mycsv:
   text = row[1]

按照 cmets 的 SO 问题 here,最好、更健壮的代码是:

import csv
with open(myfilepath, 'rb') as f:
    mycsv = csv.reader(f)
    for row in mycsv:
        text = row[1]
        ............

更新:如果 OP 真正想要的是 csv 文件最后一行中的最后一个字符串,那么有几个方法不一定需要 csv。例如,

fulltxt = open(mifilepath, 'rb').read()
laststring = fulltxt.split(',')[-1]

这对于非常大的文件并不好,因为您将完整的文本加载到内存中,但对于小文件可能没问题。请注意,laststring 可能包含换行符,因此请在使用前将其去掉。

最后,如果 OP 想要的是第 n 行中的第二个字符串(对于 n=2):

更新 2: 现在与 J.F.Sebastian 的答案中的代码相同。 (功劳是他的):

import csv
line_number = 2     
with open(myfilepath, 'rb') as f:
    mycsv = csv.reader(f)
    mycsv = list(mycsv)
    text = mycsv[line_number][1]
    ............

【讨论】:

  • 请注意,row[1] 可能是您想要的,因为 Python 中的索引是从零开始的。此外,您应该始终以二进制模式打开 CSV 文件,如 open(myfile, 'rb') - 请参阅 this answer。哦,还有 +1 用于使用 CSV 模块(正如 Tyler 指出的那样,它将正确处理引号等)。
  • @benhoyt:我想,我在重新编辑问题之前写了 row[2]。之前是aaaaa@aaa.com,bbbbb ccccc@ccc.com,ddddd
  • @benhoyt:谢谢链接。我更新了答案并记下了
  • 也许我不够清楚。我需要一种方法来获取 CSV 的特定项目(字段)。假设我有一个 100 行 2 列(逗号分隔)的 CSV。第一列电子邮件,第二列密码。例如,我想获取第 38 行中电子邮件的密码。所以我只需要第 2 列第 38 行中的项目...
  • 你的代码没有必要复杂。要提取具有给定 line_number 的行,您可以 row = next(itertools.islice(csv.reader(f), line_number, line_number+1)) stackoverflow.com/questions/5757743/…
【解决方案2】:
#!/usr/bin/env python
"""Print a field specified by row, column numbers from given csv file.

USAGE:
    %prog csv_filename row_number column_number
"""
import csv
import sys

filename = sys.argv[1]
row_number, column_number = [int(arg, 10)-1 for arg in sys.argv[2:])]

with open(filename, 'rb') as f:
     rows = list(csv.reader(f))
     print rows[row_number][column_number]

示例

$ python print-csv-field.py input.csv 2 2
ddddd

注意:list(csv.reader(f)) 将整个文件加载到内存中。为避免这种情况,您可以使用itertools:

import itertools
# ...
with open(filename, 'rb') as f:
     row = next(itertools.islice(csv.reader(f), row_number, row_number+1))
     print row[column_number]

【讨论】:

    【解决方案3】:
    import csv
    
    def read_cell(x, y):
        with open('file.csv', 'r') as f:
            reader = csv.reader(f)
            y_count = 0
            for n in reader:
                if y_count == y:
                    cell = n[x]
                    return cell
                y_count += 1
    
    print (read_cell(4, 8)) 
    

    此示例在 Python 3 中打印单元格 4、8。

    【讨论】:

      【解决方案4】:

      关于 csv.reader() 对象,您需要了解一个有趣的点。 csv.reader 对象不是list 类型,并且不可下标。

      这行得通:

      for r in csv.reader(file_obj): # file not closed
          print r
      

      这不是:

      r = csv.reader(file_obj) 
      print r[0]
      

      因此,您首先必须转换为列表类型才能使上述代码正常工作。

      r = list( csv.reader(file_obj) )
      print r[0]          
      

      【讨论】:

        【解决方案5】:

        终于明白了!!!

        import csv
        
        def select_index(index):
            csv_file = open('oscar_age_female.csv', 'r')
            csv_reader = csv.DictReader(csv_file)
        
            for line in csv_reader:
                l = line['Index']
                if l == index:
                    print(line[' "Name"'])
        
        select_index('11')
        

        “贝蒂·戴维斯”

        【讨论】:

          【解决方案6】:
          import csv
          inf = csv.reader(open('yourfile.csv','r'))
          for row in inf:
            print row[1]
          

          【讨论】:

            猜你喜欢
            • 2016-04-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-05-17
            • 2022-12-05
            • 2021-02-04
            • 2019-08-17
            • 1970-01-01
            相关资源
            最近更新 更多