Как разбить файл на несколько файлов с помощью findall - PullRequest
0 голосов
/ 06 февраля 2020

Я хочу разделить мой файл на несколько файлов в python. Так что я нахожу функцию findall, чтобы сделать это работает.

Мой файл содержит:

**05/02/2020

- Test PC


- Electricite 
W=10
PUI=5



- Test MAPS
Nothing for now
- Date/Hours
DateTest=12h14
DateFinish=13h18

**05/02/2020

Итак, я использую код, как показано ниже, чтобы разделить этот файл с '-', но он не разделен очень хорошо.

import re

def main():

  with open('mesfile.log', 'r') as f:
      data = f.read()

  found = re.findall(r'\n*(- .*?\- .*?)\n*', data, re.M | re.S)

  [open(str(i)+'.txt', 'w').write(found[i-1]) for i in range(1, len(found)+1)]

if __name__=="__main__":
  main()

Ожидаемый результат

File 1 contains
- Test PC

File 2 contains
- Electricite 
W=10
PUI=5

File 3 contains
- Test MAPS
Nothing for now

 File 4 contains
- Date/Hours
DateTest=12h14
DateFinish=13h18

**05/02/2020

Ответы [ 3 ]

1 голос
/ 06 февраля 2020

Использование:

res = []
#read content
with open(filename) as infile:
    for line in infile:
        line = line.strip()
        if line.startswith("*") or not line:continue   #skip empty line or date lines
        if line.startswith("-"):
            res.append([line])
        else:
            res[-1].append(line)

#write data to file
for idx, data in enumerate(res):
    with open("file_{}".format(idx), "w") as infile:
        infile.writelines(data)
1 голос
/ 06 февраля 2020

Вы получите эти результаты, потому что шаблон \n*(- .*?\- .*?)\n соответствует 2 раза дефису в группе захвата.

Вместо этого вы можете сопоставить строки, начинающиеся с дефиса и пробелов, а затем сопоставить все строки которые не начинаются с этого шаблона.

Затем сохраните совпадения в отдельных файлах.

^- .*(?:\r?\n(?!- ).*)*
  • ^ Начало строки
  • - .* Соответствие - и пробел, затем сопоставьте любой символ за исключением новой строки до конца
  • (?: Группа без захвата
    • \r?\n Соответствует новой строке
    • (?!- ) Утвердите, что является прямо справа не - и пробел
    • .* Соответствует любому символу, кроме новой строки 0+ раз
  • )* Закрыть группу без захвата и повторите 0+ раз

Regex demo

Обратите внимание , что вам больше не нужно re.S.

Например

found = re.findall(r'^- .*(?:\r?\n(?!- ).*)*', data, re.M)
1 голос
/ 06 февраля 2020

Вы можете попробовать это, что намного проще и быстрее, чем использовать re:

with open('mesfile.log', 'r') as f:
    data = [i.strip() for i in f]

contents = []
for line in data :
    if line.startswith('-') :  # check for '-' separator
        contents.append([])
    if len(contents) > 0 :     # ignore everything before the first separator
        contents[-1].append(line)

for i,text in enumerate(contents) :
    with open( 'file_%05d.txt' % i, 'w') as fout :
        fout.write( '\n'.join( text ) )
...