将字符串列表写入CSV文件

3
我是一名初学 Python 程序员,在本论坛中寻找解决我的问题的方案时一直不太成功。可能是因为我无法用正确的行话描述我的问题 - 如果是这种情况,我在此提前道歉。
我使用 BeautifulSoup 从 HTML 文档中提取了一个字符串列表。我想将这个字符串列表转换为 CSV(每行一个字符串,单列),但是我的程序将每个字符串的每个字符放在自己的列中。
import csv

h3List= []

soup = BeautifulSoup(open('test.html'),'html.parser')

h3 = soup.find_all('h3')

for text in h3:
    h3List.append(text.text)

with open('h3List.csv','w') as f:
    writer = csv.writer(f)
    for item in h3List: 
        print(item)
        writer.writerow(item)

输出csv文件

如上图所示,输出的csv文件将每个字符串中的每个字符都放在单独的列中。我希望“test”字符串只在一个列中。

我尝试了这个解决方案:

for item in h3List:
    print(item)
    writer.writerow([item])

但是当我的字符串包含空格时,例如字符串“test hello” - 输出的 CSV 文件按照单独的列分隔单词,如下所示:

strings with spaces

我的代码有什么问题?我怎么也想不出来。
如果此论坛中已经存在解决方案,请提供链接。谢谢!

我无法重现你的第二个问题 - writerow(['test hello']) 不会将输入视为两列。你是否尝试使用简单文本编辑器而不是电子表格编辑器查看 CSV 文件?你实际上在每一行中看到了 "test,hello" 吗? - Alexander Pivovarov
好奇怪,亚历山大!你说得对,当我在文本编辑器中打开它时,单词之间没有逗号... LibreOffice 搞砸了。非常感谢你的建议,希望我能顺利解决这个问题! - boytulog
很高兴能够提供帮助。请考虑接受我以下的回答(接受回答是一种与点赞不同的行为)。我想每个Python程序员在将每个字符视为序列元素时遇到的第一个错误都是相似的。这就是人们为了使字符串中的字符易于迭代而付出的代价,当然这是预期行为。 - Alexander Pivovarov
嗨,Alexander,谢谢你提供的信息!我已经接受了您下面看到的答案,抱歉没有更早地这样做。我仍在努力适应所有这些! - boytulog
2个回答

2

原因是因为writer.writerow期望您传递可迭代的内容 - 列表、元组或其他内容。当您传递一个字符串时,它被认为是可迭代的 - 一系列字符。因此,要解决这个问题,您需要在调用时在项目周围加上方括号:将其改为writer.writerow([item])而不是writer.writerow(item)


你好,Alexander!非常感谢您的回答,对于我的test.html文件确实有效。但是,如果我的字符串之间有空格怎么办?例如:字符串“test hello”被放置在2个单独的列中;字符串“test hello test”被放置在3个单独的列中。我该怎么做才能使这些带有空格的字符串仅在1个列中保持分开? - boytulog
根据您描述的情况,似乎您在一个只包含一个字符串 'test hello' 的列表上没有调用 writer.writerow() 函数 - 最有可能的是您的 writerow 参数实际上包含了两个项目(也许是该列表构造中的某个错误)。 - Alexander Pivovarov

1

请使用以下代码替换您当前的代码。

我正在使用pandas。

import pandas as pd
import csv

h3List= []

soup = BeautifulSoup(open('test.html'),'html.parser')

h3 = soup.find_all('h3')

for text in h3:
    h3List.append(text.text)
df = pd.DataFrame(h3List)
df.to_csv('h3_test.csv')



大家好,非常抱歉我太蠢了。问题不在代码上,而是我用来检查csv文件的程序。显然,LibreOffice有一个默认设置,使用空格作为分隔符。对不起浪费了你们的时间。 - boytulog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接