目前我正在开发一个CSV文件程序,我必须将CSV文件分区为非重叠部分(逐行),但不应在磁盘中创建任何额外文件。
目前我正在使用此程序逐行读取CSV文件的特定部分:
def dataFromFile(fname):
record = []
count=0
with open(fname, 'rb') as f:
reader = csv.reader(f)
for row in reader:
while '' in row:
row.remove('')
count+=1
record.append(row)
print count
return record[0:4]
在这里,我能够读取0-4范围内的行。 但是有可能自动化这种情况,即我们是否可以在每次读取接下来的4行时手动给出该范围,直到CSV文件结束?
CSV文件包含:
apple beer rice chicken
apple beer rice
apple beer
apple mango
milk beer rice chicken
milk beer rice
milk beer
milk mango
答案 0 :(得分:1)
您可以使用yield
:
def dataFromFile(fname):
record = []
print'Opening the file is executed once'
count = 0
with open(fname) as f:
for row in csv.reader(f, delimiter=' '):
count += 1
fields = [field for field in row if field]
if fields:
record.append(fields)
if len(record) == 4:
print 'Last yielded row:', count
yield(record)
record = []
if record:
yield record
调用:
for row in dataFromFile('your.csv'):
print row
来自口译员
>>> import csv
>>>
>>> def dataFromFile(fname):
record = []
print 'Opening the file is executed once'
count = 0
with open(fname) as f:
for row in csv.reader(f, delimiter=' '):
count += 1
fields = [field for field in row if field]
if fields:
record.append(fields)
if len(record) == 4:
print 'Last yielded row:', count
yield(record)
record = []
if record:
yield record
...
>>> for row in dataFromFile('your.csv'):
... print row
...
Opening the file is executed once
Last yielded row: 4
[['apple', 'beer', 'rice', 'chicken'], ['apple', 'beer', 'rice'], ['apple', 'beer'], ['apple', 'mango']]
Last yielded row: 8
[['milk', 'beer', 'rice', 'chicken'], ['milk', 'beer', 'rice'], ['milk', 'beer'], ['milk', 'mango']]
>>>