Как мне получить python для записи файла csv из вывода моего кода? - PullRequest
0 голосов
/ 20 июня 2020

Я невероятно новичок в python, поэтому, возможно, у меня нет правильной терминологии ...

Я извлек текст из PDF с помощью pdfplumber. Это было сохранено как объект. Код, который я использовал для этого:

with pdfplumber.open('Bell_2014.pdf') as pdf:
    page = pdf.pages[0]
    bell = page.extract_text()
    print(bell)

Итак, «колокол» - это весь текст с первой страницы импортированного PDF-файла. как выглядит звонок Мне нужно записать весь этот текст в виде строки в CSV. Я пробовал использовать:

 with open('Bell_2014_ex.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerows(bell)

и

bell_ex = 'bell_2014_ex.csv'

with open(bell_ex, 'w', newline='') as csvfile:
   file_writer = csv.writer(csvfile,delimiter=',')
   file_writer.writerow(bell)

Все, что я продолжаю находить, когда ищу, это то, как создать csv с указанными c символами или числами, но ничего из вывод уже выполненного кода. Например, я могу получить приведенный выше код:

bell_ex = 'bell_2014_ex.csv'

with open(bell_ex, 'w', newline='') as csvfile:
   file_writer = csv.writer(csvfile,delimiter=',')
   file_writer.writerow(['bell'])

, чтобы создать CSV, в одной ячейке которого есть «колокол», но это так близко, как я могу. Я чувствую, что это должно быть очень просто, но я просто не могу заставить это работать. Есть предположения? Пожалуйста, и спасибо за помощь моему неопытному «я».

Ответы [ 3 ]

1 голос
/ 20 июня 2020

page.extract_text() определяется как: «Объединяет все символьные объекты страницы в одну строку». что сделало бы bell просто очень длинной строкой.

CSV writerow() по умолчанию ожидает список строк, где каждый элемент в списке соответствует одному столбцу.

Ваша основная проблема - несоответствие типов, вы пытаетесь написать одну строку, в которой ожидается список строк. Вам нужно будет продолжить работу с объектом bell, чтобы преобразовать его в формат, приемлемый для записи в CSV.

Не зная, что содержит bell или что вы собираетесь написать, я не могу получить более подробную информацию c, но документация по CSV-модулю Python очень обширна с точки зрения разделителей настроек, диалектов, определений столбцов и т. д. c. После того, как вы преобразовали bell в правильный итеративный список строк, вы можете записать его в CSV.

0 голосов
/ 15 июля 2020

Итак, моя проблема заключалась в том, что мне не хватало «encoding = 'utf-8'» для специальных символов, а мой разделитель должен быть пробелом вместо запятой. В итоге сработало следующее:

from pdfminer.high_level import extract_text
object = extract_text('filepath.pdf')
print(object)

new_csv = 'filename.csv'

with open(new_csv, 'w', newline='', encoding = 'utf-8') as csvfile:
    file_writer = csv.writer(csvfile,delimiter=' ')
    file_writer.writerow(object)

Однако, поскольку многие из моих PDF-файлов не были настоящими PDF-файлами, а были сканированными, в CSV оказалось много странных символов. Это сработало примерно для половины имеющихся у меня PDF-файлов. Если у вас есть настоящие PDF-файлы, это будет здорово. Если нет, то сейчас я пытаюсь выяснить, как извлечь весь текст в фрейм данных pandas, разделенный заголовками внутри файлов PDF, поскольку pdfminer отлично извлек весь текст. Спасибо за помощь!

0 голосов
/ 20 июня 2020

Некоторый похожий код, который я недавно написал, преобразует файл с разделителями табуляции в csv для вставки в базу данных sqlite3:

Может быть, это полезно:

    retval = ''
    mode = 'r'
    out_file = os.path.join('input', 'listfile.csv')

    """
    Convert tab-delimited listfile.txt to comma separated values (.csv) file
    """

    in_text = open(listfile.txt, 'r')
    in_reader = csv.reader(in_text, delimiter='\t')
    out_csv = open(out_file, 'w', newline='\n')
    out_writer = csv.writer(out_csv, dialect=csv.excel)

    for _line in in_reader:
        out_writer.writerow(_line)
    out_csv.close()

... и все, не слишком крутой

...