使用python从txt文件中提取行
我是新来的,目前正在学习 python。这是我在这里的第一篇文章。
我正在尝试提取特定用户通过 .txt 文件发送的聊天记录。例如数字+99 9999 9999。但我无法获得介于两者之间的内容。
02/09/2020, 23:45 - +99 9999 9999: 02/09/2020
task A -Changes A
task b Changes b
03/09/2020, 01:55 - +88 8888 8888: 2-SEP-2020
task c -Changes c
task d Changes d
03/09/2020, 01:55 - +99 9999 9999: 2-SEP-2020
task e -Changes e
task f Changes f
我目前的代码是
number = "+99 9999 9999"
with open('text.txt') as input_data:
for line in input_data:
if number in line:
print(line)
我的输出是包含内容的数字
02/09/2020, 23:45 - +99 9999 9999: 02/09/2020
03/09/2020, 01:55 - +99 9999 9999: 2-SEP-2020
如果数字与行匹配,如何编辑我的代码以显示行?任何指导将不胜感激。
我想要的输出
02/09/2020, 23:45 - +99 9999 9999: 02/09/2020
task A -Changes A
task b Changes b
03/09/2020, 01:55 - +99 9999 9999: 2-SEP-2020
task e -Changes e
task f Changes f
新数据
[23/9/20, 11:26:42 PM] John - Salesman: 23/09/2020
-task a
-task b
[23/9/20, 11:30:03 PM] Shawn - Support: 23/09/2020
-task c
-task d
[24/9/20, 9:54:44 PM]Shawn - Support: 24/09/2020
-task e
-task f
[24/9/20, 10:06:58 PM] Damien - Support: 24/09/2020
-task g
-task h
-task i
-task j
[24/9/20, 10:53:52 PM] John - Salesman: 24/09/2020
-task k
-task l
-task m
-task n
回答
您已整理好文件读取部分。您需要弄清楚打印语句。
这是处理它的代码。为简单起见,我将文件中的所有数据分配给一个变量。我也修改了输入数据。第一组有3行+99 9999 9999
import re
filedata = '''02/09/2020, 23:45 - +99 9999 9999: 02/09/2020
task A -Changes A
task b Changes b
task c Changes c
03/09/2020, 01:55 - +88 8888 8888: 2-SEP-2020
task c -Changes c
task d Changes d
03/09/2020, 01:55 - +99 9999 9999: 2-SEP-2020
task e -Changes e
task f Changes f'''
number = '+99 9999 9999'
for line in filedata.split('n'):
z = re.match(r"[+d{2} d{4} d{4}]",line)
if z: found = number in line
if found: print (line)
对上述代码的解释:
对于读取的每一行,对 +nn nnnn nnnn 进行 reg ex 匹配,其中 n 是任何数字(d 表示数字)。结果发送到z。
如果 z 有任何值,则找到匹配项。如果我们找到匹配项,那么您想知道该行是 +99 9999 9999 还是其他一些数字模式。
如果模式匹配,则将标志设置为 found。如果找到标志,则打印该行。继续打印该行,直到找到下一组 +nn nnnn nnnn 行。找到后,检查是否为+99 9999 9999。如果不是,则将标志转为False。条件found = number in line结果为 True 或 False。当标志为 False 时,我们知道一个不同的集合已经开始。停止打印线条。
希望这能解释。如果您对逻辑仍有疑问,请告诉我。
输出将是:
02/09/2020, 23:45 - +99 9999 9999: 02/09/2020
task A -Changes A
task b Changes b
task c Changes c
03/09/2020, 01:55 - +99 9999 9999: 2-SEP-2020
task e -Changes e
task f Changes f
无论您在 +99 9999 9999 和下一组 +nn nnnn nnnn 之间有多少行,这都将起作用,其中 n 可以是任何数字。
这是读取文件所需的代码:
import re
number = "+99 9999 9999"
with open('text.txt') as input_data:
for line in input_data:
z = re.match(r"[+d{2} d{4} d{4}]",line)
if z: found = number in line
if found: print (line)
我正在对您在这里尝试做的事情进行一些疯狂的猜测。
假设您想John +99 9999 9999在文件中查找字符串并打印与此相关的所有行。然后这里是代码。
import re
filedata = '''02/09/2020, 23:45 - John +99 9999 9999: 02/09/2020
task A -Changes A
task b Changes b
task c Changes c
03/09/2020, 01:55 - Suzan +88 8888 8888: 2-SEP-2020
task c -Changes c
task d Changes d
03/09/2020, 01:55 - Thomas +99 9999 9999: 2-SEP-2020
task e -Changes e
task f Changes f'''
name = 'John'
for line in filedata.split('n'):
z = re.findall(r"w+ +d{2} d{4} d{4}",line)
if z: found = (name in line) and (line[:4] != 'task')
if found: print (line)
输出将是:
02/09/2020, 23:45 - John +99 9999 9999: 02/09/2020
task A -Changes A
task b Changes b
task c Changes c
这适用于以下代码模式:
02/09/2020, 23:45 - John , Salesman +99 9999 9999: 02/09/2020
02/09/2020, 23:45 - John Salesman +99 9999 9999: 02/09/2020
让我知道你想找到什么。希望所有这些示例都可以帮助您获得所需的内容。
根据您共享的新数据,代码如下:
filedata = """[23/9/20, 11:26:42 PM] John - Salesman: 23/09/2020
-task a
-task b
[23/9/20, 11:30:03 PM] Shawn - Support: 23/09/2020
-task c
-task d
[24/9/20, 9:54:44 PM]Shawn - Support: 24/09/2020
-task e
-task f
[24/9/20, 10:06:58 PM] Damien - Support: 24/09/2020
-task g
-task h
-task i
-task j
[24/9/20, 10:53:52 PM] John - Salesman: 24/09/2020
-task k
-task l
-task m
-task n"""
import re
name = 'John - Salesman'
for line in filedata.split('n'):
z = re.findall(r"([w+ - w+:]*d{2}/d{2}/d{4})",line)
if z: found = (name in line) and (line[:4] != 'task')
if found: print (line)
输出将是:
[23/9/20, 11:26:42 PM] John - Salesman: 23/09/2020
-task a
-task b
[24/9/20, 10:53:52 PM] John - Salesman: 24/09/2020
-task k
-task l
-task m
-task n
如果你想玩转正则表达式,你可以在这里试试regEx expression