Как узнать байтовую позицию строки CSV-файла в python?

Я работаю с огромными CSV-файлами (20-25Mln строк) и не хочу разбивать их на более мелкие части по многим причинам.

мой скрипт читает файл строка за строкой, используя CSV-файла модуль. Мне нужно теперь позицию (номер байта) строки, которая будет прочитана на следующей итерации (или которая только что была прочитана).

пробовал

>>> import csv
>>> f = open("uscompany.csv","rU")
>>> reader = csv.reader(f)
>>> reader.next()
....
>>> f.tell()
8230

но кажется CSV-файла модуль считывает файл блоками. С тех пор, как я продолжаю итерацию, я получаю та же позиция

>>> reader.next()
....
>>> f.tell()
8230

какие предложения? Пожалуйста, совет.

3 ответов


если под "позицией байта" вы подразумеваете позицию байта, как если бы вы прочитали файл как обычный текстовый файл, то мое предложение-сделать именно это. Прочитайте в файле строку за строкой как текст и получите позицию внутри строки таким образом. Вы все еще можете анализировать данные CSV строка за строкой самостоятельно, используя csv модуль:

for line in myfile:
  row = csv.reader([line]).next()

Я думаю, что это отличный дизайн для чтения CSV не предоставьте байтовую позицию такого рода, потому что это действительно не делает много смысл в контексте CSV. Ведь "data" и data являются теми же самыми четырьмя байтами данных, что и CSV, но d может быть 2-й байт 1-й байт в зависимости от того, факультативные кавычки были использованы.


короткий ответ: невозможно. Позиция байта недоступна через API csvreader


на csv модуль действительно читает в блоках, используя буфер чтения вперед, как предложено в ответах на этот пост:

.tell () несоответствие

У меня была аналогичная потребность в вас и обобщила мое решение для всех, кто мог бы делать подобные вещи:

https://github.com/loisaidasam/csv-position-reader

надеюсь, что это помогает!