2017-06-15 97 views
0

我有一个看起来像这样的文件:阅读CSV文件每两个字符

200 310 201 310 202 310 ...

基本上,这些像素坐标分组。例如,像素编号1是(200x310)。 现在,我想循环每个像素。我已经通过加载文件

with open('myfile.csv', 'rt') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
    #Now I would like to have something like : 
    for i in ??? 
     x,y = ??? 

感谢

+0

像素是全部在一条线上,还是每对一条线? –

回答

1

开始也许一个简单的方法会更好:

for i in range(0,len(spamreader),2): 
    x, y = spamreader[i], spamreader[i + 1] 

那是类似的东西,你正在寻找?编辑:这是行不通的。根据文档,你可以做这样的事情:

while(true): 
    try: 
     x = spamreader.next() #.next() returns the next element as a string 
     y = spamreader.next() # same 
     # do stuff with it... 
    except StopIteration: 
     # we have read everything 
+0

fwiw,我得到'TypeError:'_csv.reader'类型的对象没有len()'当我尝试 –

+0

我正在查看文档现在,坚持 – Xatyrian

1

你可以做这样的事情:给定输入线在你的问题

def pairwise(iterable): 
    "s -> (s0,s1), (s2,s3), (s4, s5), ..." 
    a = iter(iterable) 
    for pair in zip(a, a): 
     yield pair 

with open('myfile.csv', 'rt') as csvfile: 
    for line in csvfile: 
     for pair in pairwise(line.split()): 
      print(pair) 

输出:

('200', '310') 
('201', '310') 
('202', '310') 

在Python 3中,您可以使用一个yield from并简化pairwise()一点:

def pairwise(iterable): 
    "s -> (s0,s1), (s2,s3), (s4, s5), ..." 
    a = iter(iterable) 
    yield from zip(a, a) 
0

你可以简单地链中的CSV读者返回的行和成对使用的值

with open('myfile.csv', 'rt') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
    items = itertools.chain.from_iterable((row for row in spamreader)) 
    for i in items: 
     x, y = i, next(items) # the next consumes a second element 

由于next功能不消耗第二元件,在每次迭代你实际上在未来2个元素