расщепление питона без слов - PullRequest
0 голосов
/ 30 октября 2018

Я нашел несколько похожих вопросов, но ничего от Python.

Контекст:

У меня есть много файлов PDF (текст), в которых есть таблица среди других текстов. Положение и размер таблицы варьируется от файла к файлу. Я уже пробовал разные библиотеки, но pdftotext был лучшим до сих пор. Табула не работает, например.

Решение до сих пор:

Я использую pdftotext, чтобы извлечь всю информацию в виде большой строки, найти подстроки, которые всегда будут разделять таблицу, и сохранить таблицу в переменной

К сожалению, я не могу написать все содержимое таблицы, но первые две строки:

D  Staph. aureus  Ps. aeruginosa E. coli ATCC Ser.             Asp.           Cand. albicans
a  ATCC 6538,     ATCC 9027, Ps. 8739, Ent.     marcescens     brasiliensis   ATCC 10231,

, так как pdftotext ставит "\ n" в конце каждой строки, я могу разбить таблицу на каждую строку

Моя цель здесь состоит в том, чтобы разделить эту строку на подстроки в виде столбцов следующим образом:

['Staph. aureus', 'Ps. aeruginosa', 'E. coli ATCC', 'Ser.', 'Asp.', 'Cand. albicans']

и это:

['ATCC 6538,     ', 'ATCC 9027, Ps. ', '8739, Ent.     ', 'marcescens     ', 'brasiliensis   ', 'ATCC 10231,']

Вторая строка была разделена на каждые 15 символов, например

Я понял, что максимальная длина столбца составляет 15 символов, поэтому я попытался разделить его следующим образом: n = 15:

print([line[i: (i + n)] for i in range(0, len(line), n)])

но вот что я получаю:

['Staph. aureus  ', 'Ps. aeruginosa ', 'E. coli ATCC Se', 'r.             ', 'Asp.           ', 'Cand. albicans']

Вопрос здесь в том, как вырезать строку в подстроки, не вырезая слова? Я уже понял, что если я обрезаю линию позиции [i + n], линия позиции [i + n-1] должна быть равна "", чтобы не вырезать слово.

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Данные кажутся разделенными табуляцией, но вкладки заменяются пробелами.

Единственный шаблон, который я могу обнаружить, - это несколько пробелов между значениями столбцов. Если это так, ваш код сломался бы, если бы был двойной пробел (например, опечатка автора).

Использование максимальной ширины столбца рискованно. Он сломался бы, если столбцы имеют короткие значения (например, «один», «два»).

0 голосов
/ 30 октября 2018

Поможет ли это?

str = "D  Staph. aureus  Ps. aeruginosa E. coli ATCC Ser.             Asp.           
Cand. albicans"
list = []

for s in str.split():
    if "." in s:
        list.append(s)
    elif list:
        list[-1] = f"{list[-1]} {s}"

print(list)

выход:

['Staph. aureus', 'Ps. aeruginosa', 'E. coli ATCC', 'Ser.', 'Asp.', 'Cand. albicans']

Это разбивает строку на пробел, затем проходит через результирующий массив и начинает новую запись в списке, если слово содержит «.» и добавляет этот индекс в список со следующими словами до следующего слова с "." встречается.

Я не вижу правила, которое мы могли бы применить ко всем строкам, но с этими двумя примерами мы могли бы сделать:

line1 = "D  Staph. aureus  Ps. aeruginosa E. coli ATCC Ser.             Asp.           Cand. albicans"
line2 = "a  ATCC 6538,     ATCC 9027, Ps. 8739, Ent.     marcescens     brasiliensis   ATCC 10231,"

for line in (line1, line2):
    if line[0] == "D":
        list = []
        for s in line.split():
            if "." in s:
                list.append(s)
            elif list:
                list[-1] = f"{list[-1]} {s}"
        print(list)

    if line[0] == "a":
        count = 0
        list = []
        for s in line2[3:]:
            if count % 15 == 0 or count == 0:
                list.append(s)
                if len(list) > 1: list[-2] = list[-2].rstrip()
            else:
                list[-1] = f"{list[-1]}{s}"
            count += 1
        print(list)

выход:

['Staph. aureus', 'Ps. aeruginosa', 'E. coli ATCC', 'Ser.', 'Asp.', 'Cand. albicans']
['ATCC 6538,', 'ATCC 9027, Ps.', '8739, Ent.', 'marcescens', 'brasiliensis', 'ATCC 10231,']

Выглядит довольно ужасно, но, надеюсь, дает некоторые идеи. :)

0 голосов
/ 30 октября 2018

Вы можете разбить строку на слова, используя str.split(). Если вы не предоставите разделитель, он будет использовать пробелы по умолчанию и вернет слова строки. Смотри официальную документацию Python здесь .

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