2015-07-12 3 views
4

У меня возникли проблемы с чтением сохраненную в формате CSV с питоном:Проблема чтения CSV файл

import csv 


with open('blah.csv','rb') as csvfile: 
    data = csv.reader(csvfile) 
    row_count = sum(1 for row in data) 
    print row_count 


    r = 1 
    for row in data: 
     print r 

Моя проблема заключается в том, что, хотя питон, кажется, распознать файл и признать, что row_count = 9 (и печатает это) Безразлично» t print r для каждой строки в более позднем цикле.

Этот код правильно работает на моем компьютере, но не в облаке на www.pythonanywhere.com

+3

Возможная ошибка http://stackoverflow.com/questions/11150155/why-cant-i-repeat-the-for-loop-for-csv-reader-python – pvg

+0

, кстати, будет 'row_count = len (данные) 'быть опрятным? – hwjp

ответ

4

Это происходит потому, что в следующей строке - row_count = sum(1 for row in data) - вы уже прочитали файл, и он достиг своей цели , Так что, когда вы снова попробовать сделать -

for row in data: 
    print r 

Это не будет работать, потому что data файл находится в конце.

Одна из многих вещей, которые вы можете попробовать, - это снова открыть файл, чтобы прочитать его с самого начала.

Пример -

import csv 
with open('blah.csv','rb') as csvfile: 
    data = csv.reader(csvfile) 
    row_count = sum(1 for row in data) 
    print row_count 

with open('blah.csv','rb') as csvfile: 
    data = csv.reader(csvfile) 
    r = 1 
    for row in data: 
     print r 

Хотя вы можете также сделать и подсчет строк и печать строки в одну петлю, как -

import csv 
with open('blah.csv','rb') as csvfile: 
    data = csv.reader(csvfile) 
    row_count = 0 
    for row in data 
     row_count += 1 
     print row 
    print row_count 

Другая вещь, которую вы можете сделать, это -

csvfile.seek(0) #to make the file point to the start. 

Пример:

import csv 
with open('blah.csv','rb') as csvfile: 
    data = csv.reader(csvfile) 
    row_count = sum(1 for row in data) 
    print row_count 
    csvfile.seek(0) 
    r = 1 
    for row in data: 
     print r