Прочтите CSV, если текст совпадает, откройте файл html с соответствующим именем файла и скопируйте в текст

Хорошо, я думаю, мне просто не хватает разъемов, я новичок в Python.

Цель: прочитать CSV.
Прочитать все имена файлов в каталоге.
Если ROW в индексе (x) = имя файла в каталоге, то
откройте HTML-файл и замените текст в индексе (x) на текст из файла HTML

Код на данный момент:

import fileinput
import csv
import os
import sys
import glob
from bs4 import BeautifulSoup

htmlfiles_path = "c:\\somedirectory\\" #path to directory containing the html files
filename_search = glob.glob("c:\\somedirectory\\*.HTM") #get list of filenames

#open csv

with open ('content.csv', mode='rt') as content_file:
    reader = csv.reader (content_file, delimiter=',')
    for row in reader:
        for field in row:
            if filename_search(some matching logic i am stuck on):
                for htmlcontentfile in glob.glob(os.path.join(path, ".HTM")):
                    markup(htmlcontentfile)
                    soup = BeatifulSoup(open(markup, "r").read())
                        content_file.write(soup.get_text())
                #i think something else goes here

Я заставил работать csv-ридер и glob, чтобы вытащить список имен файлов, и у меня возникли проблемы с их подключением. Любая помощь была бы фантастической.

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

РЕДАКТИРОВАТЬ1: я использую "wt" в открытом в моем коде csv. Но дело не в этом.

У меня есть папка с файлами. Пример:

content / d100.htm
content / d101q.htm
content / d102s.htm

А также CSV:
пример CSV
CSV-файл:

Заголовок Имя Расположение
Президент Калифорнии d100.html

Цель: открыть csv, найти совпадение в разделе "Местоположение" для любого файла из папки "content".
Если найдено совпадение, откройте соответствующий файл HTM, проанализируйте только текст.
Замените поле в CSV на текстовое содержимое файла

Имеет ли это смысл?


person bhappyman    schedule 13.11.2019    source источник
comment
Вы уверены, что идентификация в content_file.write(soup.get_text()) верна?   -  person Salman Farsi    schedule 13.11.2019
comment
Пожалуйста, объясните, чего вы здесь пытаетесь достичь.   -  person Salman Farsi    schedule 13.11.2019
comment
Файл был открыт в rt режиме, что означает, что он открыт только для чтения. Измените его на 'rt' и повторите попытку.   -  person Salman Farsi    schedule 13.11.2019
comment
Если вы посмотрите документацию Python для csv, вы увидите, как правильно открыть файл.   -  person barny    schedule 13.11.2019
comment
@ Салман, мне кажется, я объяснил, что именно я собираюсь делать. Откройте CSV. Найдите имя файла. Html замените текст с содержимым HTML-файла с совпадающим именем.   -  person bhappyman    schedule 13.11.2019
comment
@barny - это остаток моих тестов, у меня есть вес в моем коде. Но я застрял не на этом. Логика поиска html-файла с таким же именем не позволяет найти HTML-файл, поэтому beautifulsoup может его проанализировать.   -  person bhappyman    schedule 13.11.2019
comment
Какое сообщение об ошибке появляется при запуске кода, опубликованного в вопросе? Укажите полную трассировку, показывающую строку, в которой возникла ошибка.   -  person barny    schedule 14.11.2019
comment
Зачем заменять ячейку в CSV текстом html? Разве такой контент не был бы гораздо удобнее использовать в отдельном файле? Также было бы намного проще программировать.   -  person Joseph Rajchwald    schedule 14.11.2019
comment
@joseph полностью зависит от того, почему его нужно поместить в csv. В этом случае система, с которой я работаю, ожидает чего-то в очень специфическом стиле. Вместо более умного, раздельного пути.   -  person bhappyman    schedule 14.11.2019
comment
@barny Две области в кодовом блоке - это то, где я застрял, filename_search & htmlcontentfile). Логика совпадения имени файла. Независимо от этого глобус правильно извлекает все имена файлов в каталоге, и открывается csv. Но затем я застрял, чтобы повторить структуру файла и вытащить совпадающее имя файла ... фактическая логика для этого. Имеет ли это смысл? Я знаю другие языки, если это поможет. Такое чувство, что я упускаю что-то базовое.   -  person bhappyman    schedule 14.11.2019
comment
Вы не пробовали код, я не буду писать за вас: советую вам прочитать документацию для os.walk()   -  person barny    schedule 14.11.2019


Ответы (1)


Отвечать:

1) @barny Я бы не писал здесь, если бы у меня не было запущенного кода. Прошу прощения за неверное толкование того, что я искал.

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

Оригинальный запрос:

CSV с

Текст | Ответить | Целевое содержимое файла

какой-то текст | Обратитесь к файлу 001.htm |
другой текст | См. Файл 002.htm |

Найдите файл и проанализируйте его содержимое до столбца рядом с ним.

Слегка изменен вопрос:

Разберите все htm-файлы в csv и укажите соответствующие им имена файлов. Затем используйте Excel для сопоставления содержимого.

Вместо того, чтобы BSoup или Python выполняли работу по сопоставлению, в Excel уже есть функция index (match ()), которая может выполнять вторую часть моего запроса. Итак, я попросил Python и Bsoup открыть каждый HTML-файл и поместить его в CSV. Я также перенес длинное имя файла в другой столбец. Вот так:

Файлы:
content / 001.htm

content / 002.htm

content / 003.htm

Ожидаемый формат вывода CSV:

Содержимое HTML-файла | Имя файла

Код:

import fileinput
import csv
import os
import sys
import glob
from bs4 import BeautifulSoup

path = "<the path>"


def main():
   for filepath in glob.glob(os.path.join('<the path>', '*.HTM')): #find folder containing html files 
    with open(filepath) as f:
        contentstuff = f.read() #find an html file, and read it
        soup = BeautifulSoup(contentstuff, "html.parser") #parse the html out
        with open (path + '\\htmlpages.csv', 'a', encoding='utf-8', newline='') as content_file:
            writer = csv.writer (content_file, delimiter=',') #start writer for file content to CSV
            fp = filepath[-12:] #trim the file name to necessary name
            for body_tag in soup.find_all('body'):
                bodye = (body_tag.text.replace("\t", "").replace("\n", "")) #deal with necessary formatting between Bsoup and Excel
                print(bodye) #show me the work
                writer.writerow([bodye, fp])  #do the actual writing

после того, как контент был в CSV, я использовал индекс (match ()), чтобы объединить имена файлов из моего основного файла и нового CSV.

person bhappyman    schedule 02.12.2019