【问题标题】:Writing a list of strings into a csv将字符串列表写入 csv
【发布时间】:2020-09-12 20:02:24
【问题描述】:

我是一名初学者 Python 程序员,我在这个论坛上寻找解决我的问题的方法没有成功。这可能是因为我无法用正确的行话来描述我的问题 - 如果是这种情况,我提前道歉。

我使用 BeautifulSoup 从 html 文档中提取字符串列表。我想将此字符串列表传输到 csv 中(单列中每行 1 个字符串)。但是,我的程序将每个字符串的每个字符放在自己的列中

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)

output csv

如上图所示,输出 csv 文件将每个字符串中的每个字符放在单独的列中。我只想要 1 列中的“测试”字符串。

我试过这个解决方案:

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

但是当我的字符串包含空格时,例如字符串“test hello” - 输出 csv 将各个列中的单词分开,如下所示:

我的代码有什么问题?对于我的生活,我似乎无法弄清楚。

如果此论坛中已经存在解决方案,我将不胜感激该帖子的链接。谢谢!!

【问题讨论】:

  • 我无法重现您的第二个问题 - writerow(['test hello']) 不会将输入视为 2 列。您是否尝试使用简单的文本编辑器而不是电子表格编辑器来查看 csv 文件?你真的在每一行看到"test,hello"吗?
  • 这太奇怪了,亚历山大!你是对的,当我在文本编辑器上打开它时,单词之间没有逗号...... LibreOffice 正在惹我。非常感谢您的意见,希望我能继续前进!
  • 乐于助人。请考虑在下面接受我的答案(接受答案是与投票不同的操作)。我想你首先遇到的每个字符都被视为序列元素的错误是每个 Python 程序员都遇到过很多次的问题。当这确实是预期的行为时,这是人们为了更容易迭代字符串的字符而付出的代价。
  • 嗨,亚历山大,感谢您提供的信息!我已经接受了您的回答,如下所示,很抱歉没有早点这样做。仍然掌握这一切!

标签: python string list csv


【解决方案1】:

原因是因为writer.writerow 期望你传递一些可以迭代的东西——一个列表、一个元组或其他任何东西。当你传递一个字符串时,它被认为是一个可迭代的 - 一个字符序列。因此,要解决此问题,您需要在调用时在 item 周围加上方括号:将其设为 writer.writerow([item]) 而不是 writer.writerow(item)

【讨论】:

  • 你好亚历山大!非常感谢您的回答,这确实适用于我的 test.html 文件。但是,如果我的字符串之间有空格怎么办?例如:字符串 'test hello' 被放置在 2 个单独的列中;字符串“test hello test”被放置在 3 个单独的列中。我该怎么做才能使这些字符串仅在 1 列中用空格分隔?
  • 根据您的描述,这听起来不像您在带有一个字符串 'test hello' 的列表上调用 writer.writerow() - 很可能您的 writerow 参数实际上包含两个项目(可能是一些构造错误该列表的)。
【解决方案2】:

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

我正在使用熊猫。

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 有一个使用空白作为分隔符的默认设置。很抱歉浪费了您的时间。
猜你喜欢
  • 2016-06-15
  • 2020-10-03
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 2014-06-17
相关资源
最近更新 更多