【发布时间】:2018-07-25 19:57:19
【问题描述】:
我有一个 WhatsApp 消息文件,我想将其保存为 csv 格式。文件如下所示:
[04/02/2018, 20:56:55] Name1: 此聊天和通话的消息现在 通过端到端加密保护。
[04/02/2018, 20:56:55] 名称 1:内容 1。
更多内容。
[04/02/2018, 23:24:44] 名称 2:内容 2。
我想将消息解析为date, sender, text 列。我的代码:
with open('chat.txt', "r") as infile, open("Output.txt", "w") as outfile:
for line in infile:
date = datetime.strptime(
re.search('(?<=\[)[^]]+(?=\])', line).group(),
'%d/%m/%Y, %H:%M:%S')
sender = re.search('(?<=\] )[^]]+(?=\:)', line).group()
text = line.rsplit(']', 1)[-1].rsplit(': ', 1)[-1]
new_line = str(date) + ',' + sender + ',' + text
outfile.write(new_line)
我在处理多行文本时遇到问题。 (我有时会在消息中跳入新行 - 在这种情况下,我在该行中只有应该是前一行的一部分的文本。) 我也对解析日期时间、发件人和文本的更多 Pythonic 方式持开放态度。 我的代码的结果是错误的,因为每一行都没有所有标准(但正确解析日期、发件人、文本):
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-33-efbcb430243d> in <module>()
3 for line in infile:
4 date = datetime.strptime(
----> 5 re.search('(?<=\[)[^]]+(?=\])', line).group(),
6 '%d/%m/%Y, %H:%M:%S')
7 sender = re.search('(?<=\] )[^]]+(?=\:)', line).group()
AttributeError: 'NoneType' object has no attribute 'group'
想法:也许使用 try-catch,然后以某种方式仅附加文本行? (听起来不像 Pythonic。)
【问题讨论】:
-
发件人的正则表达式:
(?<=\] )[^]]+(?=\:)- 我认为您应该将其更改为(?<=\] )[^]]+?(?=\:) -
date的正则表达式看起来不错(demo::regex101.com/r/TXqxPK/1)。确保该行不为空或其他内容 -
两个正则表达式都可以正常工作(我打印了输出)。问题是我有时会在我的消息中使用换行命令 - 在这种情况下,我的行中只有文本应该是前一行的一部分。
-
我认为你应该读一行。检查它是否以
[开头。如果是,则意味着读取的行是一条新消息。如果不是,这意味着读取的行是上一条消息内容的一部分。所以将它附加到上一条消息的内容中 -
创建一个临时变量,比如
x,并将其设置为空字符串。然后打开输入流。读取一行,检查第一个非空白字符是否为[。如果是,则首先将x刷新到输出流上。然后将x设置为str(date) + ',' + sender + ',' + text。如果第一个非空白字符不是[,则只需将x 设置为x + line(不输出任何内容)