





Вы все еще можете использовать file.seek (0). Например, посмотрите на следующее:
import csv
file_handle = open("somefile.csv", "r")
reader = csv.reader(file_handle)
# Do stuff with reader
file_handle.seek(0)
# Do more stuff with reader as it is back at the beginning now
Это должно работать, поскольку csv.reader работает с тем же.
Вы можете искать файл напрямую. Например:
>>> f = open("csv.txt")
>>> c = csv.reader(f)
>>> for row in c: print row
['1', '2', '3']
['4', '5', '6']
>>> f.seek(0)
>>> for row in c: print row # again
['1', '2', '3']
['4', '5', '6']
Это действительно начинается снова, но если файл имеет строку заголовка, он вернет имена столбцов в качестве «значений» для первой строки. Итак, если вы используете DictReader, вы получите такую строку: "{'name': 'name', 'dob': 'dob', 'email': 'email}"
Есть ли способ сделать то же самое, если у вас есть только ссылка на читателя, а не на дескриптор файла? Я пишу функцию, которая принимает читателя в качестве входных данных, просматривает все строки и (в идеале) затем сбрасывает местоположение файла для поиска (0) после синтаксического анализа. В идеале нам не нужно было бы передавать параметр файла также в эту функцию, а сигнатура функции была бы простой: csv_aggregate(reader, agg_functions, reset_after_calc=True) Можем ли мы использовать reader._file.seek(0) или что-то подобное?
@Federico A. Ramponi Как попасть в топ, если файлы не используются. например, csv_reader = csv.reader(stdout.decode('ascii').split('\n'), delimiter=' ')
Я обнаружил, что с csv.reader и csv.DictReader немного сложно работать из-за текущего line_num. составить список из первого чтения работает хорошо:
>>> import csv
>>> f = open('csv.txt')
>>> lines = list( csv.reader(f) ) # <-- list from csvReader
>>>
>>> for line in lines:
... print(line)
['1', '2', '3']
['4', '5', '6']
>>>
>>> for line in lines:
... print(line)
['1', '2', '3']
['4', '5', '6']
>>>
>>>lines[1]
['4', '5', '6']
это захватывает необязательная первая строка, используемый dictReader, но позволяет вам работать со списком снова и снова и даже проверять отдельные строки.
Это будет работать, но на самом деле это неэффективно с точки зрения памяти
хотя file_handle.seek (0) действительно работает, счетчик reader.line_num не сбрасывается, поэтому, если вы захотите использовать его позже, у вас возникнут проблемы. вы, конечно, можете повторить 'reader = csv.reader (file_handle)' после поиска (0), но тогда это не будет работать должным образом, если у вас есть его во внешнем цикле 'for row in reader:' как 'reader.line_num 'не увеличивается. Если вы замените цикл for на некоторое время, это решит эту проблему, но вы не совсем уверены, что вы делаете, чтобы привести в порядок ситуацию с концом файла при последнем чтении.