Python csv.reader: как вернуться в начало файла?

Когда я просматриваю файл с помощью csv.reader, как мне вернуться в начало файла. Если бы я делал это с обычным файлом, я мог бы просто сделать что-нибудь вроде «file.seek (0)». Есть ли что-нибудь подобное для модуля csv?

Заранее спасибо;)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
57
0
62 963
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы все еще можете использовать 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 работает с тем же.

хотя file_handle.seek (0) действительно работает, счетчик reader.line_num не сбрасывается, поэтому, если вы захотите использовать его позже, у вас возникнут проблемы. вы, конечно, можете повторить 'reader = csv.reader (file_handle)' после поиска (0), но тогда это не будет работать должным образом, если у вас есть его во внешнем цикле 'for row in reader:' как 'reader.line_num 'не увеличивается. Если вы замените цикл for на некоторое время, это решит эту проблему, но вы не совсем уверены, что вы делаете, чтобы привести в порядок ситуацию с концом файла при последнем чтении.

jacanterbury 29.05.2013 19:16
Ответ принят как подходящий

Вы можете искать файл напрямую. Например:

>>> 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}"

Nick K9 06.12.2016 01:19

Есть ли способ сделать то же самое, если у вас есть только ссылка на читателя, а не на дескриптор файла? Я пишу функцию, которая принимает читателя в качестве входных данных, просматривает все строки и (в идеале) затем сбрасывает местоположение файла для поиска (0) после синтаксического анализа. В идеале нам не нужно было бы передавать параметр файла также в эту функцию, а сигнатура функции была бы простой: csv_aggregate(reader, agg_functions, reset_after_calc=True) Можем ли мы использовать reader._file.seek(0) или что-то подобное?

aaronsteers 06.03.2018 00:00

@Federico A. Ramponi Как попасть в топ, если файлы не используются. например, csv_reader = csv.reader(stdout.decode('ascii').split('\n'), delimiter=' ')

Dejan 24.08.2020 06:18

Я обнаружил, что с 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, но позволяет вам работать со списком снова и снова и даже проверять отдельные строки.

Это будет работать, но на самом деле это неэффективно с точки зрения памяти

Ruslan Tolstsikau 27.02.2021 08:06

Другие вопросы по теме