Использование регулярных выражений для извлечения двух элементов из файла TXT и переименования (Python) - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь переименовать кучу текстовых файлов payslip в python, используя regex. Для этого я хочу использовать следующие элементы: personnummer (номер социального страхования) и datum (дата). Personnummer отформатирован следующим образом \ d \ d \ d \ d \ d \ d- \ d \ d \ d \ d и отлично работает сам по себе, используя код ниже.

Но когда я пытаюсь добавить datum , а также personnummer , который отформатирован следующим образом GFROM: \ d \ d \ d \ d \ d \ d \d \ d (я хочу только цифры, а не часть GFROM) Я сталкиваюсь с синтаксической ошибкой.

У вас есть предложения? Я просмотрел предыдущие посты, но ничего там не нашел.
Заранее большое спасибо.

/ Андрей

import os
import re

mydir = 'C:/Users/atutt-wi/Desktop/USB/Matrikelkort/matrikelkort prov'
personnummer = "(\d\d\d\d\d\d\-\d\d\d\d)"
datum = "(GFROM:(\d\d\d\d\d\d\d\d))"

for arch in os.listdir(mydir):
    archpath = os.path.join(mydir, arch)
    with open(archpath) as f:
        txt = f.read()
    s = re.search(personnummer, txt)
    t = re.search(datum, txt)

    name = '19' + s.group() + '  ' + '20' + t.group() + ' Matrikelkort'+ '.txt'
    newpath = os.path.join(mydir, name)
    os.rename(archpath, newpath)```


**The input files look like this;**

                                 DATUM: 010122               KUND:20290  
XXX KOMMUN              SIDA:    23   70677
PERSONS NAME                                UTB-KOD                                  ANS.DAT:                               010206-3008


                                  BOK/                  G T       ARBETS-   ARB   ARB   L L P B BRUT L                   FAST
GÄLLER GÄLLER AVG        LÖP AV   CAK/   BEFATTNINGS    R Y ANST  TIDS      TID   TID   P G L L AVDR K BLPP       BELOPP LÖNE   UPP DEL
FR O M T O M  KOD FÖR DB NR  TAL  BSK    -BENÄMNING     P P FORM  VILLKOR   %     HEL   L R G G FROM L FROM FIP*A lÖN    TIML   OMF PEN
----------------------------------------------------------------------------------------------------------------------------------------
760701 790630 110  83 20 5070LOK         HEMSAMARIT     5 1 4     10004000              Ö              7607 000000   800 000000
790701 800108 970  76 21 5017ANA-T       HEMSAMARIT     5T1 4     00004000              K            077907 000000000000 000000
KUNDNR:20290     SIDA:   023     70677    GFROM:19760701    GTOM:19800108           PERSONS NAME                            010206-3008
000001L 2   000001010122 33399CMT011MATRIKELKORT        Matrikelkort        000001CMZ029050330-7118 01-01-22    CMZ02901
                                                                                   120290                                   

**The errors i got**

runfile('C:/Users/atutt-wi/Desktop/USB/regex personnummer och datum matrikelkort tool.py', wdir='C:/Users/atutt-wi/Desktop/USB')
Traceback (most recent call last):

  File "<ipython-input-21-f7cd01adb9a3>", line 1, in <module>
    runfile('C:/Users/atutt-wi/Desktop/USB/regex personnummer och datum matrikelkort tool.py', wdir='C:/Users/atutt-wi/Desktop/USB')

  File "C:\Users\atutt-wi\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", 
line 827, in runfile
    execfile(filename, namespace)

  File "C:\Users\atutt-wi\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", 
line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/atutt-wi/Desktop/USB/regex personnummer och datum matrikelkort tool.py", line 24, in <module>
    os.rename(archpath, newpath)

OSError: [WinError 123] Incorrect syntax for file name, 
directory name or volume label: 'C:/Users/atutt-wi/Desktop/USB/Matrikelkort/matrikelkort prov\\File17.txt' -> 
'C:/Users/atutt-wi/Desktop/USB/Matrikelkort/matrikelkort prov\\010206-3008  20GFROM:19760701 Matrikelkort.txt'


**Update: When i removed the ':' from GFROM i get the following error**

  File "C:\Users\atutt-wi\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "C:\Users\atutt-wi\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/atutt-wi/Desktop/USB/regex personnummer och datum matrikelkort tool.py", line 22, in <module>
    name = '19' + s.group() + '  ' + '20' + t.group() + ' Matrikelkort'+ '.txt'

AttributeError: 'NoneType' object has no attribute 'group'

1 Ответ

0 голосов
/ 03 октября 2019

Вот фрагмент кода, который вы можете попробовать:

import os
import re

rx_num = re.compile(r"\s(\d{6}-\d{4})\s", re.M)
rx_dat = re.compile("GFROM:(\d\d\d\d\d\d\d\d)\s", re.M)

for arch in os.listdir(mydir):
    archpath = os.path.join(mydir, arch)
    with open(archpath) as f:
        txt = f.read()

    s_match = rx_num.search(txt)
    s = s_match.group() if s_match is not None else "[Missing]"

    t_match = rx_dat.search(txt)
    t = t_match.group() if t_match is not None else "[Missing]"

    name = '19' + s + '  ' + '20' + t + ' Matrikelkort'+ '.txt'

    newpath = os.path.join(mydir, name)
    os.rename(archpath, newpath)

Использование compile необязательно, но я нахожу его более понятным. Я также добавил re.M, который является флагом «Многострочный». Наконец, я добавил эти \s до и после групп, чтобы строка, подобная 'abd123456-7890def', не соответствовала. Кроме того, имейте в виду, что вы получите только первое совпадение с этим кодом. Если вы хотите каждое совпадение, попробуйте вместо этого использовать findall .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...