Вложенный список: TypeError: ожидаемая строка или байтовоподобный объект - PullRequest
0 голосов
/ 13 мая 2019

У меня есть вложенный список, в котором я хочу выполнить некоторые строковые операции. Тем не менее, я получил этот тип ошибки. Кто-нибудь знает, что это значит?

def format_Well_Data(welldata):
       cor_welldata=[]
       for Well in welldata:
            pattern = re.search(r'\d{2}\/',Well)
            ii = pattern.start()
            well2 = Well[0:ii] + '  ' + Well[ii:]
            a=cor_welldata.append(well2)
        print(a)
 format_Well_Data([['AMV-10st102/13/19 4  954  3,968  '],
                  ['AMV-0201/24/19 6  3,078  1,303 ' ]])

The code should add 2 space at the start of the date(mm/dd/yy):
[['AMV-10st1  02/13/19 4  954  3,968  '],['AMV-02  01/24/19 6  3,078  1,303 ' ]]

However, i get this huge error message:
C:\Users\gogut\AppData\Local\Continuum\anaconda3\envs\PTT\python.exe C:/APPL/DPI/PDF_reader/regextest_loop.py
Traceback (most recent call last):
  File "C:/APPL/DPI/PDF_reader/regextest_loop.py", line 14, in <module>
    ['AMV-0201/24/19 6  3,078  1,303 ' ]])
  File "C:/APPL/DPI/PDF_reader/regextest_loop.py", line 6, in format_Well_Data
    pattern = re.search(r'\d{2}\/',Well)
  File "C:\Users\gogut\AppData\Local\Continuum\anaconda3\envs\PTT\lib\re.py", line 182, in search
    return _compile(pattern, flags).search(string)
TypeError: expected string or bytes-like object

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

вам нужно было вернуть данные из функции, плюс при вводе вы храните данные в списке. Ниже приведено решение без изменения ваших входных данных

import re
def format_Well_Data(welldata):
    cor_welldata=[]
    for Well in welldata:
           for wells in Well:
               pattern = re.search(r'\d{2}\/',wells)
               ii = pattern.start()
               well2 = wells[0:ii] + '  ' + wells[ii:]
               cor_welldata.append(well2)
    print(cor_welldata)
    return cor_welldata

format_Well_Data([['AMV-10st102/13/19 4  954  3,968  '],
                  ['AMV-0201/24/19 6  3,078  1,303 '] ])

в противном случае, если вы не хотите изменять текущий код, вы можете изменить входные данные как

от

[['AMV-10st102/13/19 4 954 3,968 '],['AMV-0201/24/19 6 3,078 1,303 '] ]

до ['AMV-10st102/13/19 4 954 3,968 ','AMV-0201/24/19 6 3,078 1,303 ' ]

вот этот код для улучшения

import re
def format_Well_Data(welldata):
    cor_welldata=[]
    for Well in welldata:
        patt = re.findall(r'\d\d/\d\d/\d\d',Well)
        str1 = Well.replace(patt[0], ' {}'.format(patt[0]))
        cor_welldata.append(str1)
    return cor_welldata

format_Well_Data(['AMV-10st102/13/19 4  954  3,968  ',
                  'AMV-0201/24/19 6  3,078  1,303 ' ])
"""
output

 ['AMV-10st1 02/13/19 4  954  3,968  ', 'AMV-02 01/24/19 6  3,078  1,303 ']

 """
0 голосов
/ 13 мая 2019

Итак, две вещи.

Во-первых, re.search ожидает строку, в настоящее время вы предоставляете список.Зачем вам нужно включать список, если есть только один элемент?если их больше просто сгладить?

Второй .append метод не возвращает добавленный список, он возвращает None.Это операция на месте, поэтому просто распечатайте список.

import re
def format_Well_Data(welldata):
    cor_welldata=[]
    for Well in welldata:
        pattern = re.search(r'\d{2}\/', Well)
        ii = pattern.start()
        well2 = Well[0:ii] + '  ' + Well[ii:]
        cor_welldata.append(well2)
    print(cor_welldata)

format_Well_Data(['AMV-10st102/13/19 4  954  3,968  ',
                  'AMV-0201/24/19 6  3,078  1,303 ' ])

ВЫХОД:

['AMV-10st1  02/13/19 4  954  3,968  ', 'AMV-02  01/24/19 6  3,078  1,303 ']
...