【问题标题】:How to write both Chinese characters and English characters into a file (Python 3)?如何将汉字和英文字符写入文件(Python 3)?
【发布时间】:2018-07-18 18:31:06
【问题描述】:

我编写了一个脚本来抓取 YouTube 播放列表页面的标题

根据打印语句,一切正常,直到我尝试将标题写入文本文件,此时我得到“UnicodeEncodeError: 'charmap' codec can't encode characters in position...”

我尝试在打开文件时添加“encoding='utf8'”,虽然这修复了错误,但所有中文字符都被随机的乱码替换

我还尝试使用“替换”对输出字符串进行编码,然后对其进行解码,但这也只是将所有特殊字符替换为问号

这是我的代码:

from bs4 import BeautifulSoup as BS
import urllib.request
import re

playlist_url = input("gib nem: ")

with urllib.request.urlopen(playlist_url) as response:
  playlist = response.read().decode('utf-8')
  soup = BS(playlist, "lxml")

title_attrs = soup.find_all(attrs={"data-title":re.compile(r".*")})
titles = [tag["data-title"] for tag in title_attrs]

titles_str = '\n'.join(titles)#.encode('cp1252','replace').decode('cp1252')

print(titles_str)
with open("playListNames.txt", "a") as f:
    f.write(titles_str)

这是我用来测试的示例播放列表: https://www.youtube.com/playlist?list=PL3oW2tjiIxvSk0WKXaEiDY78KKbKghOOo

【问题讨论】:

  • 您确定这些乱码不是由于您的编辑器/您使用什么来显示结果吗?
  • 我只是将此代码复制到一个文件中,并使用给出的 URL 运行它而没有错误。我会向您展示一些输出,但我遇到了复制和粘贴问题,抱歉。您是否有机会在 Python 2 下运行此代码?
  • @ArneRecknagel 我不这么认为;我正在使用 Sublime Text 2
  • @holdenweb 这很奇怪;我正在使用 Spyder IDE 在 Python 3 下运行代码
  • 您正在附加到playListNames.txt。你确定文件的编码是UTF吗?您是否尝试过creating a new file open("playListNames_new.txt", "w")(可能还设置了编码)?

标签: python html python-3.x unicode fwrite


【解决方案1】:

使用编码可以解决您的问题。 Windows 默认为 ANSI 编码,在美国 Windows 上为 Windows-1252。它不支持中文。您应该使用utf8utf-8-sig 作为编码。一些 Windows 编辑器更喜欢后者,否则会采用 ANSI。

with open('playListNames.txt','w',encoding='utf-8-sig') as f:

【讨论】:

  • 更准确地说,Windows 根本不关心文件编码,它是 Text Editors,就像记事本一样。
【解决方案2】:

documentation 明确文件编码:

encoding 是用于解码或编码的编码名称 文件。这应该只在文本模式下使用。默认编码是 平台相关(无论locale.getpreferredencoding() 返回), 但是可以使用 Python 支持的任何文本编码。查看编解码器 支持编码列表的模块。

回答您上次评论中的问题。

  1. 您可以通过以下方式了解 Windows 上的首选编码是什么

    import locale
    locale.getpreferredencoding()
    

如果playListNames.txt 是用open('playListNames.txt', 'w') 创建的,那么locale.getpreferredencoding() 返回的值将用于编码。

如果文件是手动创建的,那么编码取决于编辑器的默认/首选编码。

  1. 请参阅How to convert a file to utf-8 in Python?How do I convert an ANSI encoded file to UTF-8 with Notepad++? [closed]

【讨论】:

    猜你喜欢
    • 2016-06-12
    • 2012-03-11
    • 2020-05-21
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多