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

Dobriyk0t

Client
Регистрация
28.12.2016
Сообщения
121
Реакции
74
Баллы
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, т.к. были ошибки из-за кодировки файлов. Теперь не должно быть.
 
Последнее редактирование:
Спасибо!

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

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

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

Но, не могли бы Вы поделиться исходным кодом - как то exe качать совершенно не удобно.
В идеале бы шаблончик для Зеннопостера...
Пожалуйста, выложил исходный код.
 
  • Спасибо
Реакции: BAZAg
делим большой фаил на куски по 20кк строк в linux:
Развернуть Свернуть Копировать
split -l 20000000 -d --additional-suffix=.txt icanall.txt icanall_part_
 
  • Спасибо
Реакции: djaga
Если весь файл долго открывается, вроде вариант был - прочитать одну строку, затем удалить её. И перейти к следующей. И так, пока весь файл не обработается.
 
Иногда бывают тхт сливы в которых по 10-15 млн строк (что за мазахисты это делают?:D) Не открываются не екселем не чем другим, либо ждешь по полтара часа даже на нормальном пк
Спасибо автору, сохранил
 
Иногда бывают тхт сливы в которых по 10-15 млн строк (что за мазахисты это делают?:D) Не открываются не екселем не чем другим, либо ждешь по полтара часа даже на нормальном пк
Спасибо автору, сохранил
EmEditor могёт(в доступе есть версии где замочек открыт:-) ), даже на слабом ПК творит чудеса и с более крупными файлами/списками.
 
  • Спасибо
Реакции: djaga, lx2003 и AntonBust
  • Спасибо
Реакции: lx2003 и djaga

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