Есть ли способ прочитать файл в цикле в python, используя разделитель, отличный от новой строки

Я обычно читаю файлы вроде этого в Python:

f = open('filename.txt', 'r')
for x in f:
    doStuff(x)
f.close()

Однако это разделяет файл по символам новой строки. Теперь у меня есть файл, который имеет всю свою информацию в одной строке (45 000 строк, разделенных запятыми). Хотя файл такого размера тривиально читать, используя что-то вроде

f = open('filename.txt', 'r')
doStuff(f.read())
f.close()

Мне любопытно, если бы для гораздо большего файла, который все в одной строке, можно было бы добиться аналогичного эффекта итерации, как в первом фрагменте кода, но с разбиением на запятую вместо новой строки или любым другим символом?

Ответ 1

Следующая функция - довольно простой способ сделать то, что вы хотите:

def file_split(f, delim=',', bufsize=1024):
    prev = ''
    while True:
        s = f.read(bufsize)
        if not s:
            break
        split = s.split(delim)
        if len(split) > 1:
            yield prev + split[0]
            prev = split[-1]
            for x in split[1:-1]:
                yield x
        else:
            prev += s
    if prev:
        yield prev

Вы бы использовали его следующим образом:

for item in file_split(open('filename.txt')):
    doStuff(item)

Это должно быть быстрее, чем решение, связанное с EMS, и сэкономит много памяти за чтение всего файла за большие файлы.

Ответ 2

Откройте файл с помощью open(), затем используйте метод file.read(x) для чтения (приблизительно) следующих x байтов из файла. Вы можете продолжать запрашивать блоки из 4096 символов, пока не нажмете конец файла.

Вам нужно будет реализовать разделение самостоятельно - вы можете вдохнуть вдохновение из модуля csv, но я не думаю, что вы можете использовать его напрямую, потому что он не был предназначен для работы с чрезвычайно длинными линиями.