Файл Python изменения на месте

я предполагаю, что это верно, что использование элемента таблицы для расположения имеет мало общего с табличными данными.И что же? Мой босс заботится? Мои пользователи заботятся?

Google и другие автоматизированные системы делают уход, и они так же важны во многих ситуациях. Семантический код легче для неинтеллектуальной системы проанализировать и обработать.

8
задан Sarah Vessels 17 July 2009 в 19:58
поделиться

7 ответов

Допустим, вы хотите разделить файл на 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, и я не знаю, насколько быстро файловая система действительно освободит место.

7
ответ дан 5 December 2019 в 19:02
поделиться

Если вы работаете в Linux / Unix, почему бы не использовать команду разделения, такую ​​как этот парень ?

split --bytes=100m /input/file /output/dir/prefix

РЕДАКТИРОВАТЬ: затем используйте csplit .

2
ответ дан 5 December 2019 в 19:02
поделиться

Я почти уверен, что есть, так как я даже мог редактировать / читать из исходных файлов скриптов, которые я запускал, но самой большой проблемой, вероятно, было бы все смещение это было бы сделано, если бы вы начали с начала файла. С другой стороны, если вы пройдете по файлу и запишете все начальные позиции строк, вы сможете затем скопировать строки в обратном порядке; как только это будет сделано, вы можете вернуться, взять новые файлы по одному и (если они достаточно малы) использовать readlines () для создания списка, изменить порядок в списке, а затем перейти к началу файла и замените строки в их старом порядке строками в их новом порядке. который усекает все данные за текущую позицию файла, если используется без каких-либо аргументов, кроме аргументов файлового объекта, при условии, что вы используете один из классов или подкласс одного из классов из пакета io для чтения ваш файл. Вам просто нужно убедиться, что текущая позиция файла заканчивается в начале последней строки для записи в новый файл.)

РЕДАКТИРОВАТЬ: на основе вашего комментария о необходимости делать разделения при надлежащем закрытии теги, вам, вероятно, также придется разработать алгоритм для обнаружения таких тегов (возможно, используя метод peek ), возможно, используя регулярное выражение.

который усекает все данные за текущую позицию файла, если используется без каких-либо аргументов, кроме аргументов файлового объекта, при условии, что вы используете один из классов или подкласс одного из классов из пакета io для чтения ваш файл. Вам просто нужно убедиться, что текущая позиция файла заканчивается в начале последней строки для записи в новый файл.)

РЕДАКТИРОВАТЬ: на основе вашего комментария о необходимости делать разделения при надлежащем закрытии теги, вам, вероятно, также придется разработать алгоритм для обнаружения таких тегов (возможно, используя метод peek ), возможно, используя регулярное выражение.

1
ответ дан 5 December 2019 в 19:02
поделиться

Если время не является важным фактором (или износ диска):

  1. Открыть дескриптор файла
  2. Прочитать до размера вашего раздела / логической точки останова (из-за xml)
  3. Сохраните оставшуюся часть файла на диск (не знаю, как python обрабатывает это, вплоть до прямой перезаписи файла или использования памяти)
  4. Записать раздел на диск
  5. goto 1

Если Python не дает вам такого уровня контроля, возможно, вам придется погрузиться в C.

0
ответ дан 5 December 2019 в 19:02
поделиться

Пришло время купить новый жесткий диск!

Вы можете сделать резервную копию, прежде чем пробовать все другие ответы, и не потерять данные :)

-1
ответ дан 5 December 2019 в 19:02
поделиться

Вы всегда можете проанализировать XML-файл и записать скажем, каждые 10000 элементов в собственный файл. Взгляните на раздел «Добавочный синтаксический анализ» этой ссылки. http://effbot.org/zone/element-iterparse.htm

0
ответ дан 5 December 2019 в 19:02
поделиться

Вот мой сценарий ...

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)
0
ответ дан 5 December 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: