【问题标题】:My script produces illegible output in a csv file我的脚本在 csv 文件中产生难以辨认的输出
【发布时间】:2019-04-12 03:44:21
【问题描述】:

当我运行我的脚本时,我在控制台中获得了所需的输出,但是当我在 csv 文件中写入相同的内容时,输出变得难以辨认。我尝试了encoding="utf-8",但没有运气,还是一样。

sitelink

这些是我愿意在 csv 文件中写入的部分内容。

অ অংশ অংশ অংশাংশি.

到目前为止我已经写了:

import csv
import requests
from bs4 import BeautifulSoup

url = "http://www.english-bangla.com/browse/bntobn/"

def get_links(link):
    res = requests.get(link)
    soup = BeautifulSoup(res.text,"lxml")
    items = [item.text for item in soup.select("#cat_page ul > li > a")]
    return items

if __name__ == '__main__':
    with open("output.csv","w",newline="",encoding="utf-8") as f:
        writer = csv.writer(f)
        for item in get_links(url):
            writer.writerow(item)

如何以正确的方式将内容写入 csv 文件?

【问题讨论】:

  • 可能上下文是正确的,但您在工具中显示 CSV,该工具不适用于 UTF-8 或没有字体来显示它。您是否尝试在 python 中读取 CSV 并从 python 显示?

标签: python python-3.x csv web-scraping


【解决方案1】:

我怀疑这是你的问题:

writer.writerow(item)

writerow 方法需要一系列项目,其中每个项目对应于 csv 文件中的一列。您通常会用某种可迭代的方式调用它,例如列表。例如:

writer.writerow(['one', 'two', 'three'])

会在您的 csv 文件中生成一个如下所示的条目:

one,two,three

在 Python 中,字符串也恰好是可迭代的。比较一下,我们传递一个项目的列表:

writer.writerow(['this is a test'])

有了这个,我们在其中传递了一个字符串:

writer.writerow('this is a test')

前者会导致:

this is a test

后者会导致:

t,h,i,s, ,i,s, ,a, ,t,e,s,t

所以你可能想这样写你的主块:

if __name__ == '__main__':
    with open("output.csv","w",newline="",encoding="utf-8") as f:
        writer = csv.writer(f)
        for item in get_links(url):
            writer.writerow([item])

或者,正如@furas 建议的那样,摆脱for 循环:

if __name__ == '__main__':
    with open("output.csv","w",newline="",encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerow(get_links(url))

这两种解决方案都将您带到同一个地方。第二种效率更高。

这将生成一个 csv 文件,如下所示:

অ
অংশ
অংশ
অংশাংশি
অংশান
.
.
.

【讨论】:

  • 我试过你的建议@larsks。这是我在 csv 文件 অ অংশ অংশ অংশাংশি অংশান অংশিনà§â€Œ অংশৠঅংশ২ 中得到的输出
  • 这不是我在使用 Python 3.6.8 运行相同代码时看到的。我在答案中显示的输出是从生成的输出中直接提取的。你用什么来检查 csv 文件?
  • 我直接手动打开了csv文件,复制了内容以便粘贴到这里。我正在使用 python 3.7+。
  • 不,第二个效率不高,因为它们将内容显示在一行中,这不是我所期望的。我会坚持你的解决方案,但输出还不理想。
【解决方案2】:

writerow() 需要元素列表,而不是单个元素。
然后将每个元素放在单独的列中(使用逗号)

with open("output.csv","w", newline="",encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(get_links(url))

如果您放置单个元素 - 字符串 - 那么它会将其视为字符列表
并将每个字符放在单独的列中 - 所以字符之间有逗号。

【讨论】:

  • 我也尝试了您的建议,但我在 csv 文件中写入的内容类似于 অ অংশ অংশ অংশাংশি অংশান.
  • 你是怎么检查这个的?正如我在上面的评论中所说 - 问题可以是您用来显示它的工具。我使用了你的代码并在 Linux 文本编辑器 Pluma 中打开了文件,我看对了。
  • 引导您完成 - 我以崇高的文本执行代码。执行完成后,我会在目录中得到一个包含数据的 csv 输出。我手动打开它,上面是我在那个 csv 文件中看到的输出。关于我如何打开它,还有任何混乱的余地吗?随意问。谢谢。
  • 将 csv 读取到 python 并从 python 显示。即print(open("output.csv").read())
  • 这给了我正确的输出。在其他情况下,无论我如何打开 csv 文件,我都能看到显示的内容?当我手动打开时,我无法在该 csv 文件中看到所需的内容吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
相关资源
最近更新 更多