如何获取CSV文件的特定字段?
我需要一种方法来获取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]
............