Как обработать большой текстовый файл?

Ссылка скопирована
1 ответ

Помогите! допустим, у меня есть текстовый файл на 3 106 666 666 строк, как пройтись по элементам?я пробовал сначала открыть с помощью

file = open("sus.txt", "r", encoding='utf-8') file = open("sus.txt", "r", encoding='utf-8')  n = 0  a = []  r = 0  for line in file:     n += 1     a.append(line)     if n == 500:         r += 1         q = open(str(r), 'w+', encoding='utf-8')         q.writelines(a)         a = []         q.close()         n = 0

file = open("sus.txt", "r", encoding='utf-8') file = open("sus.txt", "r", encoding='utf-8') n = 0 a = [] r = 0 for line in file: n += 1 a.append(line) if n == 500: r += 1 q = open(str(r), 'w+', encoding='utf-8') q.writelines(a) a = [] q.close() n = 0

но сохранялось все в 5 файлов весом примерно 1,5 гб, хотя исходный был 222 гб

Дополнительно:

раз не осилил python, может эту задачу проще решить средствами OS? ну или освоить дебагинг

  • file = open("sus.txt", "r", encoding='utf-8') file = open("sus.txt", "r", encoding='utf-8')

    file = open("sus.txt", "r", encoding='utf-8') file = open("sus.txt", "r", encoding='utf-8')

    Почему дублируется строка?

    В какой ОС нужно разбить файл на куски поменьше? В Линуксе есть команда split.

  • Иерокопус Таманский, не дублируется, я нечайно скопировал код неправильно
    сплит же действует на строки, а не списки
  • Reroun, в линуксе split действует на файлы.
  • Ответы:

    Зачем ты складываешь строки в список? Почему не писать их сразу в выходной файл?

    with open("sus.txt", "r", encoding='utf-8') as source:     idx = 1  # номер файла-приёмника     go = True     while go:         with open(f'part{idx}.txt', 'w', encoding='utf-8') as dest:             for _ in range(500):  # не более 500 строк в каждый файл                 line = source.readline()                 if not line:  # пустая строка = конец файла                     go = False                     break                 dest.write(line)         idx += 1

    with open("sus.txt", "r", encoding='utf-8') as source: idx = 1 # номер файла-приёмника go = True while go: with open(f'part{idx}.txt', 'w', encoding='utf-8') as dest: for _ in range(500): # не более 500 строк в каждый файл line = source.readline() if not line: # пустая строка = конец файла go = False break dest.write(line) idx += 1

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Дмитрий К. Ответ

    Для обработки большого текстового файла в PHP можно воспользоваться функцией fopen для открытия файла в режиме чтения, fgets для чтения содержимого файла построчно, а также fclose для закрытия файла после завершения обработки.

    Пример кода:

    $file = fopen('file.txt', 'r'); // открываем файл для чтения
     
    if ($file) {
        while (($line = fgets($file)) !== false) {
            // обрабатываем каждую строку файла
            echo $line; // просто выводим строку, но здесь можно добавить любую логику обработки
        }
     
        fclose($file); // закрываем файл после обработки
    } else {
        echo 'Ошибка открытия файла';
    }

    $file = fopen('file.txt', 'r'); // открываем файл для чтения if ($file) { while (($line = fgets($file)) !== false) { // обрабатываем каждую строку файла echo $line; // просто выводим строку, но здесь можно добавить любую логику обработки } fclose($file); // закрываем файл после обработки } else { echo 'Ошибка открытия файла'; }

    Если файл слишком большой и его содержимое не помещается в оперативной памяти, можно использовать другой подход. Например, можно читать файл блоками с помощью функции fread:

    $file = fopen('file.txt', 'r'); // открываем файл для чтения
     
    if ($file) {
        $bufferSize = 4096; // размер блока для чтения файла
        while (!feof($file)) {
            $buffer = fread($file, $bufferSize);
            // обрабатываем каждый блок данных
            echo $buffer; // просто выводим данные, здесь можно добавить свою логику обработки
        }
     
        fclose($file); // закрываем файл после обработки
    } else {
        echo 'Ошибка открытия файла';
    }

    $file = fopen('file.txt', 'r'); // открываем файл для чтения if ($file) { $bufferSize = 4096; // размер блока для чтения файла while (!feof($file)) { $buffer = fread($file, $bufferSize); // обрабатываем каждый блок данных echo $buffer; // просто выводим данные, здесь можно добавить свою логику обработки } fclose($file); // закрываем файл после обработки } else { echo 'Ошибка открытия файла'; }

    Таким образом, вы можете эффективно обрабатывать большие текстовые файлы в PHP без перегрузки оперативной памяти.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно