使用Python将纯文本文件解析为CSV文件

2024-06-28 20:32:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一系列的HTML文件,使用beautifuldsoup解析成一个文本文件。HTML文件的格式设置使其输出始终是文本文件中的三行,因此输出将类似于:

Hello!
How are you?
Well, Bye!

但这也很容易

83957
And I ain't coming back!
hgu39hgd

换言之,HTML文件的内容并不是每一个文件的标准,但它们总是产生三行。

所以,我想知道我应该从哪里开始,如果我想,然后采取的文本文件,是由美丽的汤和解析成一个CSV文件列,如(使用上述例子):

Title   Intro   Tagline
Hello!    How are you?    Well, Bye!
83957    And I ain't coming back!    hgu39hgd

从文本文件中剥离HTML的Python代码如下:

import os
import glob
import codecs
import csv
from bs4 import BeautifulSoup

path = "c:\\users\\me\\downloads\\"

for infile in glob.glob(os.path.join(path, "*.html")):
    markup = (infile)
    soup = BeautifulSoup(codecs.open(markup, "r", "utf-8").read())
    with open("extracted.txt", "a") as myfile:
        myfile.write(soup.get_text())

我想我可以用这个来设置CSV文件中的列:

csv.put_HasColumnNames(True)

csv.SetColumnName(0,"title")
csv.SetColumnName(1,"intro")
csv.SetColumnName(2,"tagline")

我的空白是如何在文本文件(extracted.txt)中一次迭代一行,当我到达一个新行时,将其设置为CSV文件中的正确单元格。文件的前几行是空的,每一组文本之间有许多空行。所以,首先我需要打开文件并阅读它:

file = open("extracted.txt")

for line in file.xreadlines():
    pass # csv.SetCell(0,0 X) (obviously, I don't know what to put in X)

另外,我不知道如何告诉Python继续读取文件,并将其添加到CSV文件直到完成。换句话说,无法确切地知道HTML文件中总共有多少行,因此我不能只是csv.SetCell(0,0) to cdv.SetCell(999,999)


Tags: 文件csvpathinimporttxthellohtml
2条回答

也许我没有正确理解你,但你可以:

file = open("extracted.txt")

# if you don't want to do .strip() again, just create a list of the stripped 
# lines first.
lines = [line.strip() for line in file if line.strip()]

for i, line in enumerate(lines):
    csv.SetCell(i % 3, line)

我不完全确定您使用的是什么CSV库,但它看起来不像Python's built-in one。不管怎样,我会这样做:

import csv
import itertools

with open('extracted.txt', 'r') as in_file:
    stripped = (line.strip() for line in in_file)
    lines = (line for line in stripped if line)
    grouped = itertools.izip(*[lines] * 3)
    with open('extracted.csv', 'w') as out_file:
        writer = csv.writer(out_file)
        writer.writerow(('title', 'intro', 'tagline'))
        writer.writerows(grouped)

这样就形成了一条管道。它首先从文件中获取数据,然后删除行中的所有空白,然后删除任何空行,然后将它们分组为三个组,然后(在写入CSV头之后)将这些组写入CSV文件。

要合并注释中提到的最后两列,可以用明显的方式将writerow调用和writerows更改为:

writer.writerows((title, intro + tagline) for title, intro, tagline in grouped)

相关问题 更多 >