- Регистрация
- 28.12.2016
- Сообщения
- 102
- Благодарностей
- 59
- Баллы
- 28
Всем привет!
Продолжаю выкладывать небольшие технические решения, которых нет на форуме и которые могут понадобиться при работе с зенкой.
Многие сталкиваются с проблемой разделения очень больших файлов, например текстовые файлы на несколько гигов.
Я также сталкиваюсь с такой проблемой и постоянно использовал костыли чтобы решить здесь и сейчас и дальше заниматься другими задачами. Но вот настал момент, когда мне это надоело и я захотел решить эту проблему раз и навсегда. Написал простой скрипт на пайтон и обернул его в небольшую графическую оболочку для удобства использования.
Предлагаю всем, кто сталкивается с такой проблемой использовать его. Скрипт оформлен .exe файлом(т.к. загружать .exe файлы нельзя, выкладываю ссылку на него).
Сформированные файлы будут помещены в ту же папку, где находится исходный файл.
Проверено на вирусы.
Также по просьбе пользователей выкладываю исходный код:
UPD. Обновил код и exe, т.к. были ошибки из-за кодировки файлов. Теперь не должно быть.
Продолжаю выкладывать небольшие технические решения, которых нет на форуме и которые могут понадобиться при работе с зенкой.
Многие сталкиваются с проблемой разделения очень больших файлов, например текстовые файлы на несколько гигов.
Я также сталкиваюсь с такой проблемой и постоянно использовал костыли чтобы решить здесь и сейчас и дальше заниматься другими задачами. Но вот настал момент, когда мне это надоело и я захотел решить эту проблему раз и навсегда. Написал простой скрипт на пайтон и обернул его в небольшую графическую оболочку для удобства использования.
Предлагаю всем, кто сталкивается с такой проблемой использовать его. Скрипт оформлен .exe файлом(т.к. загружать .exe файлы нельзя, выкладываю ссылку на него).
Сформированные файлы будут помещены в ту же папку, где находится исходный файл.
Проверено на вирусы.
Также по просьбе пользователей выкладываю исходный код:
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()
Последнее редактирование: