如何获取CSV文件的特定字段?

33 投票
7 回答
157869 浏览
提问于 2025-04-16 16:15

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

假设我有一个CSV文件:

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

我该如何只获取'ddddd'呢?

我对这个语言还很陌生,尝试过一些关于csv模块的东西,但我还是不太明白...

7 个回答

8

有一个有趣的点需要注意,那就是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]          
8

示例

#!/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
import itertools
# ...
with open(filename, 'rb') as f:
     row = next(itertools.islice(csv.reader(f), row_number, row_number+1))
     print row[column_number]

注意:list(csv.reader(f)) 会把整个文件都加载到内存里。为了避免这种情况,你可以使用 itertools

33
import csv
mycsv = csv.reader(open(myfilepath))
for row in mycsv:
   text = row[1]

根据在这个问题下的评论,下面是一个更好、更稳健的代码:

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

更新:如果提问者实际上想要的是csv文件最后一行的最后一个字符串,有几种方法可以做到,这些方法不一定需要用到csv格式。例如:

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

这种方法不适合处理非常大的文件,因为它会把整个文本加载到内存中,但对于小文件来说可能还不错。请注意,laststring 可能包含换行符,所以在使用之前要去掉它。

最后,如果提问者想要的是第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]
    ............

撰写回答