Разделение больших файлов

Dobriyk0t

Client
Регистрация
28.12.2016
Сообщения
102
Благодарностей
59
Баллы
28
Всем привет!
Продолжаю выкладывать небольшие технические решения, которых нет на форуме и которые могут понадобиться при работе с зенкой.

Многие сталкиваются с проблемой разделения очень больших файлов, например текстовые файлы на несколько гигов.
131766


Я также сталкиваюсь с такой проблемой и постоянно использовал костыли чтобы решить здесь и сейчас и дальше заниматься другими задачами. Но вот настал момент, когда мне это надоело и я захотел решить эту проблему раз и навсегда. Написал простой скрипт на пайтон и обернул его в небольшую графическую оболочку для удобства использования.
Предлагаю всем, кто сталкивается с такой проблемой использовать его. Скрипт оформлен .exe файлом(т.к. загружать .exe файлы нельзя, выкладываю ссылку на него).
Сформированные файлы будут помещены в ту же папку, где находится исходный файл.

131765


Проверено на вирусы.

Также по просьбе пользователей выкладываю исходный код:

Separator by Dobriyk0t:
import tkinter as tk
from tkinter import filedialog, simpledialog
import os
def split_file(input_file, output_prefix, lines_per_file=1000000):
    try:
        status_window = tk.Toplevel(root)
        status_window.title("Статус разделения")
        status_window.geometry("200x80")
        status_label = tk.Label(status_window, text="В процессе...")
        status_label.pack(pady=20)
        # Определяем кодировку файла
        try:
            with open(input_file, 'rb') as f:
                raw_data = f.read()
                encoding = chardet.detect(raw_data)['encoding']
                if not encoding:
                    encoding = 'utf-8'  # По умолчанию
        except Exception:
            encoding = 'utf-8'
        with open(input_file, 'r', encoding=encoding, errors='replace') as f:
            # Подсчитываем общее количество строк в файле
            total_lines = sum(1 for _ in f)
            f.seek(0)
            file_count = 0
            line_count = 0
            output_file = None
            for line in f:
                if line_count % lines_per_file == 0:
                    if output_file:
                        output_file.close()
                    file_count += 1
                    output_file = open(f'{output_prefix}{file_count}.txt', 'w', encoding=encoding)
                output_file.write(line)
                line_count += 1
            if output_file:
                output_file.close()
        print("Файл успешно разделен!")
        status_window.destroy()
    except Exception as e:
        print(f"Ошибка при разделении файла: {e}")
def select_file():
    file_path = filedialog.askopenfilename(title="Выберите файл для разделения")
    if file_path:
        entry_file.delete(0, tk.END)
        entry_file.insert(0, file_path)
def start_split():
    input_file = entry_file.get()
    lines_per_file = int(entry_lines.get()) if entry_lines.get().isdigit() else 1000000
    if not input_file or not os.path.exists(input_file):
        print("Пожалуйста, выберите существующий файл.")
        return
    output_dir = os.path.dirname(input_file)
    output_prefix = os.path.join(output_dir, "part_")
    split_file(input_file, output_prefix, lines_per_file)
# Основное окно
root = tk.Tk()
root.title("Separator by Dobriyk0t")
# Элементы интерфейса
label_file = tk.Label(root, text="Выберите файл:")
label_file.grid(row=0, column=0, padx=10, pady=5)
entry_file = tk.Entry(root, width=50)
entry_file.grid(row=0, column=1, padx=10, pady=5)
button_select = tk.Button(root, text="Обзор...", command=select_file)
button_select.grid(row=0, column=2, padx=10, pady=5)
label_lines = tk.Label(root, text="Количество строк в каждой части:")
label_lines.grid(row=1, column=0, padx=10, pady=5)
entry_lines = tk.Entry(root, width=10)
entry_lines.insert(0, "1000000")
entry_lines.grid(row=1, column=1, padx=10, pady=5)
button_split = tk.Button(root, text="Разделить", command=start_split)
button_split.grid(row=2, column=0, columnspan=3, pady=20)
# Запуск основного цикла
root.mainloop()
UPD. Обновил код и exe, т.к. были ошибки из-за кодировки файлов. Теперь не должно быть.
 
Последнее редактирование:

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 874
Благодарностей
2 588
Баллы
113
Спасибо!

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

Но, не могли бы Вы поделиться исходным кодом - как то exe качать совершенно не удобно.
В идеале бы шаблончик для Зеннопостера...
 

Dobriyk0t

Client
Регистрация
28.12.2016
Сообщения
102
Благодарностей
59
Баллы
28
Спасибо!

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

Но, не могли бы Вы поделиться исходным кодом - как то exe качать совершенно не удобно.
В идеале бы шаблончик для Зеннопостера...
Пожалуйста, выложил исходный код.
 
  • Спасибо
Реакции: BAZAg

seodamage

Client
Регистрация
08.09.2014
Сообщения
232
Благодарностей
74
Баллы
28
делим большой фаил на куски по 20кк строк в linux:
split -l 20000000 -d --additional-suffix=.txt icanall.txt icanall_part_
 
  • Спасибо
Реакции: djaga

lx2003

Client
Регистрация
15.02.2021
Сообщения
648
Благодарностей
147
Баллы
43
Если весь файл долго открывается, вроде вариант был - прочитать одну строку, затем удалить её. И перейти к следующей. И так, пока весь файл не обработается.
 

AntonBust

Client
Регистрация
27.03.2025
Сообщения
6
Благодарностей
1
Баллы
3
Иногда бывают тхт сливы в которых по 10-15 млн строк (что за мазахисты это делают?:D) Не открываются не екселем не чем другим, либо ждешь по полтара часа даже на нормальном пк
Спасибо автору, сохранил
 

lx2003

Client
Регистрация
15.02.2021
Сообщения
648
Благодарностей
147
Баллы
43

usboff

Client
Регистрация
25.08.2021
Сообщения
106
Благодарностей
73
Баллы
28
Иногда бывают тхт сливы в которых по 10-15 млн строк (что за мазахисты это делают?:D) Не открываются не екселем не чем другим, либо ждешь по полтара часа даже на нормальном пк
Спасибо автору, сохранил
EmEditor могёт(в доступе есть версии где замочек открыт:-) ), даже на слабом ПК творит чудеса и с более крупными файлами/списками.
 
  • Спасибо
Реакции: djaga, lx2003 и AntonBust

Dobriyk0t

Client
Регистрация
28.12.2016
Сообщения
102
Благодарностей
59
Баллы
28
  • Спасибо
Реакции: lx2003 и djaga

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)