Чтение одного целого числа за один раз с помощью python


Как я могу прочитать int из файла? У меня есть большой (512 МБ) txt-файл, который содержит целочисленные данные в виде:

0 0 0 10 5 0 0 140
0 20 6 0 9 5 0 0
Теперь, если я использую c = file.read(1), я получаю только один символ за раз, но мне нужно одно целое число за раз. Например:
c = 0
c = 10
c = 5
c = 140 and so on...

Любое великое сердце, пожалуйста, помогите. Заранее спасибо.

3 5

3 ответа:

Вот один из способов:

with open('in.txt', 'r') as f:
  for line in f:
    for s in line.split(' '):
      num = int(s)
      print num

Делая for line in f, Вы читаете бит за битом (не используя ни read() all, ни readlines). Важно, потому что ваш файл большой.

Затем вы разбиваете каждую строку на пробелы и читаете каждое число по ходу.

Вы можете сделать больше проверки ошибок, чем этот простой пример, который будет блевать, если файл содержит поврежденные данные.

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

512 Мб на самом деле не так уж и много. Если вы все равно собираетесь создать список данных, я не вижу проблем с выполнением шага чтения за один раз:

my_int_list = [int(v) for v in open('myfile.txt').read().split()]

Если вы можете структурировать свой код так, что вам не нужен весь список в памяти, было бы лучше использовать генератор:

def my_ints(fname):
    for line in open(fname):
        for val in line.split():
            yield int(val)

И затем использовать его:

for c in my_ints('myfile.txt'):
    # do something with c (which is the next int)

Я бы сделал это следующим образом:

  • буфер = файл.читать(8192)
  • содержимое + = буфер
  • разбить выходную строку на пробел
  • удалить последний элемент из массива (возможно, не полный номер)
  • заменить содержимое на строку последнего элемента
  • повторяйте, пока буфер не станет нулевым '