Dr_Elvis
@Dr_Elvis
В гугле забанен

Как начать парсинг csv с нужной строки?

Есть csv на 32кк строк.
Построчно нужно обработать данные. Все строчки обработать не проблема, через обычный for, но как указать что начать с определенной строки?
with open(csvfile, encoding='utf-8-sig') as f:
    fr = csv.reader(f, delimiter=';')
    for i, row in enumerate(fr):
        foobar(row)

Можно конечно в начале цикла добавить что-то типо такого:
with open(csvfile, encoding='utf-8-sig') as f:
    fr = csv.reader(f, delimiter=';')
    for i, row in enumerate(fr):
        if i < 21721482:
            continue
        foobar(row)

Но будет всё равно перебираться весь файл, хоть и без логики.
Есть более изящный способ?
  • Вопрос задан
  • 288 просмотров
Решения вопроса 1
dimonchik2013
@dimonchik2013
non progredi est regredi
заморачивался недавно этим вопросом, точнее - как быстрее пробежаться по строкам

на стекофервло есть 2-3 топика с советами: там и читать чанками/чунками
и читаь binary с проскакиванием переводов строк, и этот fseek (ну он про чанки же и есть)

на 80 млрд строк не нашлось ничего эффективнее как вы в начале и написали

with open(csvfile, encoding='utf-8-sig') as f:
    fr = csv.reader(f, delimiter=';')
    for i, row in enumerate(fr):
        if i < 21721482:
            continue
        foobar(row)


единственное - я читаю сначала просто файл построчно,
а потом к строке применяю csv dialect - ибо в строках могут быть переводы или кодировка что сломает csv массив
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@AVKor
islice из itertools или другой вариант: pandas с опцией skiprows = N в read_csv.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Если csv.reader поддерживает интерфейс iterable то можно сделать фильтр как тут пишут https://learnpython.com/blog/map-filter-reduce-python/

filter(function, iterable)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы