Как мне прочитать все файлы HTML в каталоге и записать содержимое в файл CSV, используя Python? - PullRequest
2 голосов
/ 23 сентября 2019

Я пытаюсь прочитать все файлы HTML в каталоге и записать их в файл CSV.Каждая строка в CSV-файле будет содержать содержимое одного HTML-файла.

Кажется, я могу прочитать один HTML-файл и записать в CSV-файл.

import os, csv
import fnmatch
from pathlib import Path

directory = "directory/"

for dirpath, dirs, files in os.walk(directory):
    for filename in fnmatch.filter(files, '*.html'):
        with open(os.path.join(dirpath, filename)) as f:
            html = f.read()
            if 'apples and oranges' in html:
                with open('output.csv', 'w') as f:
                    writer = csv.writer(f)
                    lines = [[html]]
                    for l in lines:
                        writer.writerow(l)

В настоящее время я толькоувидеть, как один файл HTML распечатывается в одну строку CSV.

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Это потому, что вы использовали 'w' или режим записи .

with open('output.csv', 'w') as f:

, который усекает файл и перезаписывает предыдущее содержимое.

Вы должны использовать 'a' или режим добавления .

with open('output.csv', 'a') as f:

Это открывает файл для записи, если он еще не существует, или добавляет кконец файла, если он уже существует.

0 голосов
/ 23 сентября 2019

При использовании open ('output.csv', 'w') это означает, что вы перезаписываете файл каждый раз, когда это выполняется, поэтому каждую итерацию цикла.Это похоже на сохранение нового материала в файл с тем же именем.Материал, который был в файле до сохранения, не будет виден после.Вам нужно использовать open ('output.csv', 'a'), чтобы файл, в который вы записываете, только добавлялся, а не перезаписывался.Однако если вы используете append, вы хотите удалить файл, если он уже существует, в противном случае вы будете добавлять к своим старым результатам.

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

import os
import fnmatch
import re


directory = "directory/"

#Remove the output file if it exists, otherwise you'll have output from the previous execution
if (os.path.exists('output.csv')):
    os.remove('output.csv')

for dirpath, dirs, files in os.walk(directory):
    for filename in fnmatch.filter(files, '*.html'):
        with open(os.path.join(dirpath, filename)) as f:
            html = [line.rstrip("\n") for line in f]    #Puts each line from the html file into a list
            lines = "".join(html)                       #Concats that list into a single string
            line = re.sub(" +", " ", lines)             #Gets rid of superfluous whitespace, but substituting any chains of spaces " +" for just one single space
            if re.search("apples and oranges", line):   
                with open('output.csv', 'a') as f:      #Changed w (which stand for write) to append. With w the file is rewritten every time it's called. With a the file only has text appended to the end
                    f.write(line + ",\n")

#Removes the comma and newline at the end of the file
with open("output.csv", 'rb+') as filehandle:
    filehandle.seek(-2, os.SEEK_END)
    filehandle.truncate()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...