import sys
def chunkify(items, chunk_size):
acc = 0
position = 0
for n, i in enumerate(items):
size = sys.getsizeof(i)
if acc + size >= chunk_size:
yield items[position:position+n]
acc = 0
position = n
else:
acc += size
chunks = chunkify(arr, 3072)
Естественно, если какая-то строка будет размером больше 3кб, вы получите в chunks элемент больше 3кб. Но с этим бороться можно только объединением всего массива в одну огромную строку и разбивку её на равные куски.
И ещё одно важное замечание - функция chunkify разбивает список на трёхкилобайтные порции в памяти виртуальное машины Python. При записи в файл размер этих порций станет меньше. Если запись будет проводиться в юникоде, то незначительно, а если в однобайтной кодировке, то более чем в два раза. Чтобы разбить именно по размеру который порции будут занимать на диске, надо вместо sys.getsizeof() использовать len() и умножать количество символов на размер символа в байтах.
import random
import sys
def chunkify(items, chunk_size):
acc = 0
position = 0
for n, i in enumerate(items):
size = sys.getsizeof(i)
if acc + size >= chunk_size:
yield items[position:position+n]
acc = 0
position = n
acc += size
arr = random.sample(range(1, 1000000), 1000)
chunks = chunkify(arr, 3072)
for i, c in enumerate(chunks):
print('****')
print(c)
print('****')
str1 = ''.join(str(e) for e in c)
myfile = open(str(i) + '.txt', 'w')
myfile.write(str1)
результат:
-rw-rw-r-- 1 sv sv 753 Aug 8 10:47 8.txt
drwxr-xr-x 2 sv sv 125 Aug 8 10:47 .
-rw-rw-r-- 1 sv sv 2.0K Aug 8 10:47 6.txt
-rw-rw-r-- 1 sv sv 1.4K Aug 8 10:47 7.txt
-rw-rw-r-- 1 sv sv 3.2K Aug 8 10:47 4.txt
-rw-rw-r-- 1 sv sv 2.7K Aug 8 10:47 5.txt
-rw-rw-r-- 1 sv sv 2.5K Aug 8 10:47 3.txt
-rw-rw-r-- 1 sv sv 1.3K Aug 8 10:47 1.txt
-rw-rw-r-- 1 sv sv 1.9K Aug 8 10:47 2.txt
-rw-rw-r-- 1 sv sv 641 Aug 8 10:47 0.txt
pcdesign, анализ содержимого файлов и прогон под отладчиком покажет причину такого распределения. Мне проверить сейчас не на чем. Ну, либо делайте объединением строк с последующим сплитом по фиксированному размеру, как я уже писал:
def chunkify(items, chunk_size):
for i in range(0, len(items), chunk_size):
yield items[i:i+chunk_size]
for n, s in enumerate(chunkify(''.join(arr), 1536)):
with open(str(n) + '.txt', encoding='utf-8') as fh:
fh.write(s)