我正在使用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])
- 循环打印出一些东西,但第二个却没有。如果有人可以在幕后解释这里发生的事情,那就太好了。
答案 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。
希望这会对你有所帮助。