Python: Как разделить файл .txt на два или более файлов с одинаковым количеством строк в каждом? - PullRequest
0 голосов
/ 02 сентября 2018

(мне кажется, я часами искал на стек-обмене и в интернете, но не смог найти правильный ответ)

То, что я пытаюсь сделать здесь, это подсчитать количество строк в файле, я добился этого с помощью этого кода здесь

# Does not loud into memory
def file_len(fname):
with open(fname) as f:
    for i, l in enumerate(f, 1):
        pass
    print(i)

file_len('bigdata.txt')

затем я беру количество строк в файле и делю его на два / три / и т. Д. (Чтобы сделать два / три / и т. Д. Файла с одинаковым количеством строк), например. bigdata.txt = 1000000 строк 1000000/2 = 500000 Итак, здесь у меня будет два файла по 500000 строк в каждом, один от 1 до 500000, а другой от 500001 до 1000000. У меня уже есть этот код, который ищет шаблон в исходном файле (bigdata.txt), но я не ищу какой-либо шаблон, просто хочу разбить его на две половины или еще что-нибудь. Вот код для этого:

# Does not loud into memory
with open('bigdata.txt', 'r') as r:
with open('fhalf', 'w') as f:
    for line in r:
        if line == 'pattern\n': # Splits the file when there is an occurence of the pattern.
#But the occurence as you may notice won't be included in either the two files which is not a good thing since I need all the data.
            break
                f.write(line)
with open('shalf.txt', 'w') as f:
    for line in r:
        f.write(line)

Так что я ищу простое решение, и я знаю, что оно есть, просто пока не могу его найти. Примером может быть: file1.txt, file2.txt, каждый с одинаковыми номерами строк. Спасибо всем за потраченное время.

1 Ответ

0 голосов
/ 02 сентября 2018

Прочитайте все строки в списке с помощью .readlines(), а затем вычислите, сколько строк нужно распределить в каждом файле, а затем приступайте к записи!

num_files = 2
with open('bigdata.txt') as in_file:
    lines = in_file.readlines()
    lines_per_file = len(lines) // num_files
    for n in range(num_files):
        with open('file{}.txt'.format(n+1), 'w') as out_file:
            for i in range(n * lines_per_file, (n+1) * lines_per_file):
                out_file.write(lines[i])

И полный тест:

$ cat bigdata.txt 
line1
line2
line3
line4
line5
line6
$ python -q
>>> num_files = 2
>>> with open('bigdata.txt') as in_file:
...     lines = in_file.readlines()
...     lines_per_file = len(lines) // num_files
...     for n in range(num_files):
...         with open('file{}.txt'.format(n+1), 'w') as out_file:
...             for i in range(n * lines_per_file, (n+1) * lines_per_file):
...                 out_file.write(lines[i])
... 
>>> 
$ more file*
::::::::::::::
file1.txt
::::::::::::::
line1
line2
line3
::::::::::::::
file2.txt
::::::::::::::
line4
line5
line6

Если вы не можете прочитать bigdata.txt в память, тогда решение .readlines() не обрежет его.

Вам придется писать строки по мере их чтения, что не составляет особого труда.

Что касается определения длины, во-первых, этот вопрос обсуждает некоторые методы, мой любимый метод sum() Кайла.

num_files = 2
num_lines = sum(1 for line in open('bigdata.txt'))
lines_per_file = num_lines // num_files
with open('bigdata.txt') as in_file:
    for n in range(num_files):
        with open('file{}.txt'.format(n+1), 'w') as out_file:
            for _ in range(lines_per_file):
                out_file.write(in_file.readline())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...