使用 utf-8 编码写入 csv 时遇到问题

Trouble with writing to a csv using utf-8 encoding

提问人:uberts64 提问时间:6/15/2023 最后编辑:uberts64 更新时间:6/15/2023 访问量:80

问:

我正在尝试分析一些 facebook messenger 数据,但在 utf-8 编码方面遇到了问题。

import os
import json
import datetime
from tqdm import tqdm
import csv
from datetime import datetime 

directory = "facebook-100071636101603/messages/inbox"
folders = os.listdir(directory)

if ".DS_Store" in folders:
    folders.remove(".DS_Store")

for folder in tqdm(folders):
    print(folder)
    for filename in os.listdir(os.path.join(directory,folder)):
        if filename.startswith("message"):
            data = json.load(open(os.path.join(directory,folder,filename), "r"))
            for message in data["messages"]:
                try:
                    date = datetime.fromtimestamp(message["timestamp_ms"] / 1000).strftime("%Y-%m-%d %H:%M:%S")
                    sender = message["sender_name"]
                    content = message["content"]
                    with open('output.csv', 'w', encoding="utf-8") as csv_file:
                        writer = csv.writer(csv_file)
                        writer.writerow([date,sender,content])

                except KeyError:
                    pass

此脚本有效,但输出 csv 不显示带重音的字符。

我对此非常了解,所以我没有尝试很多。我阅读了 Python csv 文档并找到了这段话

由于 open() 用于打开 CSV 文件进行读取,因此默认情况下,该文件将使用系统默认编码解码为 unicode(请参阅 locale.getencoding())。若要使用其他编码对文件进行解码,请使用 open 的编码参数:

导入 CSV 使用 open('some.csv', newline='', encoding='utf-8') 作为 f: 读者 = csv.reader(f) 对于阅读器中的行: print(行)

但这似乎行不通。

编辑:这是我得到的输出,但它应该是 Jørn 而不是 Jà ̧rn 和 quête,而不是 quête。

python csv utf-8 facebook-messenger

评论

0赞 M.Ryan 6/15/2023
尝试将 “encoding=”utf-8“ 添加到此行 data = json.load(open(os.path.join(directory,folder,filename), ”r“, encoding=”utf-8“))

答:

0赞 Bob The Builder 6/15/2023 #1

尝试添加到此行:encoding="utf-8

json.load(open(os.path.join(directory,folder,filename), "r", encoding="utf-8"))

这将确保您导入的每个文件都采用 utf-8 编码格式

编辑:

您需要使用 .此包将修复损坏的编码。 通过编写以下内容来更改并使用 ftfy 修复编码:pip install ftfysendercontent

import ftfy
# Your other code
sender = message["sender_name"]
content = message["content"]
sender = ftfy.fix_text(sender)
content = ftfy.fix_text(content)

您也可以用于任何其他损坏的编码。ftfy.fix_text(string)

评论

0赞 uberts64 6/15/2023
谢谢你的回答!可悲的是,它并不能解决我的问题,我仍然在没有口音的情况下获得相同的输出。
0赞 Bob The Builder 6/15/2023
您能否展示输出是什么以及预期输出是什么,以便更好地了解问题
0赞 uberts64 6/15/2023
我已经编辑了问题以包含输出。
0赞 Bob The Builder 6/15/2023
@uberts64我改变了我的答案,这应该可以解决您的问题(如果有效,请记住点赞并接受答案!
0赞 uberts64 6/15/2023
就是这样!非常感谢。