对于csv模块中的循环

时间:2016-06-16 05:55:25

标签: python csv

我正在使用csv模块进行一些解析,但是我已经被一个我无法实现的问题所困扰。我认为for的{​​{1}} - 循环消除了循环的行。例如:

csv.reader()

虽然第一个import csv f = open('example.csv', 'rb') r = csv.reader(f) for row in r: print(row[0]) for row in r: print(row[1]) - 循环打印出一些东西,但第二个却没有。如果有人可以在幕后解释这里发生的事情,那就太好了。

1 个答案:

答案 0 :(得分:1)

对于任何错误都很晚了很抱歉,我需要对我的python技能进行一些修改,但我会尝试解决你的问题。

来自文档:

  

csv.reader(csvfile,dialect ='excel',** fmtparams)   返回一个读取器对象,它将迭代给定csvfile中的行。 csvfile可以是任何支持迭代器协议的对象,并在每次调用next()方法时返回一个字符串

通常,读者位于目标文件的开头,并且每次用户调用next()时都会逐行读取,因此您不应期望读者再次在同一文件上进行迭代,因为它已经迭代过了。

在本例中,我们读取了csv文件的前两行:

import csv
with open('example.csv', 'rb') as csvfile:
    r = csv.reader(csvfile)
    line = r.next()
    line2 = r.next() 
print line
print line2

结果是:

['name', 'lastname', 'number']
['name1', 'lastname1', '99999999']

因此,你可以假设读者的next()方法返回一个标记列表,作为从csv读取的每一行的字符串。

来自文档:For Loops

  

...具有可迭代方法的任何对象都可以在Python的for循环中使用...

     

...拥有一个可迭代的方法基本上意味着数据可以以列表形式呈现,其中有序的方式有多个值。您可以通过使用next()和iter()方法创建对象来定义自己的迭代...

见这个例子:

import csv
csvList = []
with open('example.csv', 'rb') as csvfile:
    r = csv.reader(csvfile)
    for row in r:
        csvList.append(row)
print csvList

这将输出值作为字符串列表,包括标题:

[['name', 'lastname', 'number'], ['name1', 'lastname1', '99999999'], ['name2', 'lastname2', '88888888']]

如果您打算解析csv,可以使用一些实用方法,例如DictReader()

import csv
with open('example.csv', 'rb') as csvfile:
    r = csv.DictReader(csvfile)
    for row in r:
        print(row['name'], row['lastname'], row['number'])

这将打印:

('name1', 'lastname1', '99999999')
('name2', 'lastname2', '88888888')

来自文档:

  

csv.DictReader(csvfile,fieldnames = None,restkey = None,restval = None,dialect ='excel',* args,** kwds):创建一个像普通读者一样操作的对象,但将读取的信息映射到一个字典,其键由可选的fieldnames参数给出。

因此,如果要为csv文件的每个字段提供不同值的列表,可以创建一个字典并在每次迭代中追加该行的每个值。

import csv
nameDict = {'name':[], 'lastname':[], 'number':[]}
with open('example.csv', 'rb') as csvfile:
    r = csv.DictReader(csvfile)
    for row in r:
        nameDict['name'].append(row['name'])
        nameDict['lastname'].append(row['lastname'])
        nameDict['number'].append(row['number'])     
print nameDict

这产生了这样的东西:

{'lastname': ['lastname1', 'lastname2', 'lastname3', 'lastname4', 'lastname5', 'lastname6', 'lastname7', 'lastname8', 'lastname9', 'lastname10'], 'name': ['name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7', 'name8', 'name9', 'name10'], 'number': ['99999999', '88888888', '88888888', '88888888', '88888888', '88888888', '88888888', '88888888', '88888888', '88888888']}

有关更好的解析csv的方法,请参阅module documentation

希望这会对你有所帮助。