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

Dobriyk0t

Client
Joined
Dec 28, 2016
Messages
105
Reaction score
61
Points
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, т.к. были ошибки из-за кодировки файлов. Теперь не должно быть.
 
Last edited:

BAZAg

Client
Joined
Nov 8, 2015
Messages
1,880
Reaction score
2,604
Points
113
Спасибо!

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

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

Dobriyk0t

Client
Joined
Dec 28, 2016
Messages
105
Reaction score
61
Points
28
Спасибо!

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

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

seodamage

Client
Joined
Sep 8, 2014
Messages
232
Reaction score
74
Points
28
делим большой фаил на куски по 20кк строк в linux:
split -l 20000000 -d --additional-suffix=.txt icanall.txt icanall_part_
 
  • Thank you
Reactions: djaga

lx2003

Client
Joined
Feb 15, 2021
Messages
648
Reaction score
147
Points
43
Если весь файл долго открывается, вроде вариант был - прочитать одну строку, затем удалить её. И перейти к следующей. И так, пока весь файл не обработается.
 

AntonBust

Client
Joined
Mar 27, 2025
Messages
10
Reaction score
1
Points
3
Иногда бывают тхт сливы в которых по 10-15 млн строк (что за мазахисты это делают?:D) Не открываются не екселем не чем другим, либо ждешь по полтара часа даже на нормальном пк
Спасибо автору, сохранил
 

lx2003

Client
Joined
Feb 15, 2021
Messages
648
Reaction score
147
Points
43

usboff

Client
Joined
Aug 25, 2021
Messages
106
Reaction score
73
Points
28
Иногда бывают тхт сливы в которых по 10-15 млн строк (что за мазахисты это делают?:D) Не открываются не екселем не чем другим, либо ждешь по полтара часа даже на нормальном пк
Спасибо автору, сохранил
EmEditor могёт(в доступе есть версии где замочек открыт:-) ), даже на слабом ПК творит чудеса и с более крупными файлами/списками.
 

Dobriyk0t

Client
Joined
Dec 28, 2016
Messages
105
Reaction score
61
Points
28
Для работы удобно будет. А чего не Zennoposter ом?
Такие небольшие инструменты проще делать скриптом, который может работать отдельно.
 
  • Thank you
Reactions: lx2003 and djaga

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)