я предполагаю, что это верно, что использование элемента таблицы для расположения имеет мало общего с табличными данными.И что же? Мой босс заботится? Мои пользователи заботятся?
Google и другие автоматизированные системы делают уход, и они так же важны во многих ситуациях. Семантический код легче для неинтеллектуальной системы проанализировать и обработать.
Допустим, вы хотите разделить файл на N частей, а затем просто начать чтение с конца файла (более или менее) и несколько раз вызвать truncate :
Обрезать размер файла. Если указан необязательный аргумент размера, файл обрезается (не более) до этого размера. Размер по умолчанию соответствует текущей позиции. Текущая позиция файла не изменяется. ...
import os
import stat
BUF_SIZE = 4096
size = os.stat("large_file")[stat.ST_SIZE]
chunk_size = size // N
# or simply set a fixed chunk size based on your free disk space
c = 0
in_ = open("large_file", "r+")
while size > 0:
in_.seek(-min(size, chunk_size), 2)
# now you have to find a safe place to split the file at somehow
# just read forward until you found one
...
old_pos = in_.tell()
with open("small_chunk%2d" % (c, ), "w") as out:
b = in_.read(BUF_SIZE)
while len(b) > 0:
out.write(b)
b = in_.read(BUF_SIZE)
in_.truncate(old_pos)
size = old_pos
c += 1
Будьте осторожны, я ничего из этого не проверял. Может потребоваться вызвать flush
после вызова truncate, и я не знаю, насколько быстро файловая система действительно освободит место.
Если вы работаете в Linux / Unix, почему бы не использовать команду разделения, такую как этот парень ?
split --bytes=100m /input/file /output/dir/prefix
РЕДАКТИРОВАТЬ: затем используйте csplit .
Я почти уверен, что есть, так как я даже мог редактировать / читать из исходных файлов скриптов, которые я запускал, но самой большой проблемой, вероятно, было бы все смещение это было бы сделано, если бы вы начали с начала файла. С другой стороны, если вы пройдете по файлу и запишете все начальные позиции строк, вы сможете затем скопировать строки в обратном порядке; как только это будет сделано, вы можете вернуться, взять новые файлы по одному и (если они достаточно малы) использовать readlines () для создания списка, изменить порядок в списке, а затем перейти к началу файла и замените строки в их старом порядке строками в их новом порядке. который усекает все данные за текущую позицию файла, если используется без каких-либо аргументов, кроме аргументов файлового объекта, при условии, что вы используете один из классов или подкласс одного из классов из пакета io
для чтения ваш файл. Вам просто нужно убедиться, что текущая позиция файла заканчивается в начале последней строки для записи в новый файл.)
РЕДАКТИРОВАТЬ: на основе вашего комментария о необходимости делать разделения при надлежащем закрытии теги, вам, вероятно, также придется разработать алгоритм для обнаружения таких тегов (возможно, используя метод peek
), возможно, используя регулярное выражение.
io
для чтения ваш файл. Вам просто нужно убедиться, что текущая позиция файла заканчивается в начале последней строки для записи в новый файл.)
РЕДАКТИРОВАТЬ: на основе вашего комментария о необходимости делать разделения при надлежащем закрытии теги, вам, вероятно, также придется разработать алгоритм для обнаружения таких тегов (возможно, используя метод peek
), возможно, используя регулярное выражение.
Если время не является важным фактором (или износ диска):
Если Python не дает вам такого уровня контроля, возможно, вам придется погрузиться в C.
Пришло время купить новый жесткий диск!
Вы можете сделать резервную копию, прежде чем пробовать все другие ответы, и не потерять данные :)
Вы всегда можете проанализировать XML-файл и записать скажем, каждые 10000 элементов в собственный файл. Взгляните на раздел «Добавочный синтаксический анализ» этой ссылки. http://effbot.org/zone/element-iterparse.htm
Вот мой сценарий ...
import string
import os
from ftplib import FTP
# make ftp connection
ftp = FTP('server')
ftp.login('user', 'pwd')
ftp.cwd('/dir')
f1 = open('large_file.xml', 'r')
size = 0
split = False
count = 0
for line in f1:
if not split:
file = 'split_'+str(count)+'.xml'
f2 = open(file, 'w')
if count > 0:
f2.write('<?xml version="1.0"?>\n')
f2.write('<StartTag xmlns="http://www.blah/1.2.0">\n')
size = 0
count += 1
split = True
if size < 1073741824:
f2.write(line)
size += len(line)
elif str(line) == '</EndTag>\n':
f2.write(line)
f2.write('</EndEndTag>\n')
print('completed file %s' %str(count))
f2.close()
f2 = open(file, 'r')
print("ftp'ing file...")
ftp.storbinary('STOR ' + file, f2)
print('ftp done.')
split = False
f2.close()
os.remove(file)
else:
f2.write(line)
size += len(line)