Python 3.x 如何在python3中从textfile提取特定部分
这是我的python文件Python 3.x 如何在python3中从textfile提取特定部分,python-3.x,Python 3.x,这是我的python文件 path = '/my/file/list.txt' with open(path,'rt') as file: print("step 1") collected_lines = [] started = False for line in file: for n in range(1, 10): if line.startswith('PLAY NO.{}'.format(n)):
path = '/my/file/list.txt'
with open(path,'rt') as file:
print("step 1")
collected_lines = []
started = False
for line in file:
for n in range(1, 10):
if line.startswith('PLAY NO.{}'.format(n)):
started = True
print("started at line {}".format(line[0]))
continue
if started:
collected_lines.append(line)
if started and line == 'PLAY NO.{}'.format(n+1):
print("end at line {}".format(line[0]))
break
print(collected_lines.append(line))
这是我的密码。。
输出:
现在我要从第二局开始到第三局。。。。但是我一个也没有得到。。请提供任何建议。。。我正在使用Python 3.5
对不起,这是第一次在这个网站上提问。。
我的文件看起来像这样
textfile.txt
Hello and Welcome This is the list of plays being performed here
PLAY NO. 1
1. adknjkd
2. skdi
3. ljdij
PLAY NO. 2
1. hsnfhkjdnckj
2. sjndkjhnd and so on
给出:
step 1
### started at line 2
### end at line 7
collected_lines:
PLAY NO. 1
1. adknjkd
2. skdi
3. ljdij
关于固定问题的说明:
.lstrip()
以使.startswith()
按预期工作startswith('PLAY NO.{}.)中的NO.
和{}
之间添加了一个空格。格式(n)
,以便if条件可以找到该行if
s的顺序,以避免认为结束行位于起始行start=False
,以停止收集行格式
字符串中缺少空格,仅修复此问题无法解决问题,因此必须修复这两个问题才能使代码按预期工作。等等…请参见上面的注释
给出:
step 1
### started at line 2
### end at line 7
collected_lines:
PLAY NO. 1
1. adknjkd
2. skdi
3. ljdij
关于固定问题的说明:
.lstrip()
以使.startswith()
按预期工作startswith('PLAY NO.{}.)中的NO.
和{}
之间添加了一个空格。格式(n)
,以便if条件可以找到该行if
s的顺序,以避免认为结束行位于起始行start=False
,以停止收集行前导空格的问题已经足以阻止代码找到行。由于
格式
字符串中缺少空格,仅修复此问题无法解决问题,因此必须修复这两个问题才能使代码按预期工作。以此类推……请参阅上面的注释。如果您想要一个标签为e播放编号和项目列表中包含有关播放的行,您可以使用defaultdict
定义文本
定义正则表达式
解析行
屈服
defaultdict(list,
{1: [(2, '1. adknjkd'), (3, '2. skdi'), (4, '3. ljdij')],
2: [(7, '1. hsnfhkjdnckj'), (8, '2. sjndkjhnd and so on')]})
在stout
上的输出:
0 Hello and Welcome This is the list of plays being performed here
PLAY NO. 1 started at line number 1
1 PLAY NO. 1
2 1. adknjkd
3 2. skdi
4 3. ljdij
5
PLAY NO. 1 ended at line number 5
PLAY NO. 2 started at line number 6
6 PLAY NO. 2
7 1. hsnfhkjdnckj
8 2. sjndkjhnd and so on
如果您想要一个带有播放编号标签和播放相关行列表的dict,您可以使用
defaultdict
定义文本
定义正则表达式
解析行
屈服
defaultdict(list,
{1: [(2, '1. adknjkd'), (3, '2. skdi'), (4, '3. ljdij')],
2: [(7, '1. hsnfhkjdnckj'), (8, '2. sjndkjhnd and so on')]})
在stout
上的输出:
0 Hello and Welcome This is the list of plays being performed here
PLAY NO. 1 started at line number 1
1 PLAY NO. 1
2 1. adknjkd
3 2. skdi
4 3. ljdij
5
PLAY NO. 1 ended at line number 5
PLAY NO. 2 started at line number 6
6 PLAY NO. 2
7 1. hsnfhkjdnckj
8 2. sjndkjhnd and so on
什么行?您没有显示任何行。我们需要一个文件示例,我建议您筛选您要筛选的行。查看一下,这可能会提示您如何以方便的方式执行此操作。此外,我建议使用正则表达式筛选该行,如
None!=re.match(“^no[0-9][^0-9]”,line)
您编写:“现在我想要从第二盘开始到第三盘开始的台词….”
,但在文件中没有第三盘……这不是我的观点,但对我来说是有意义的:。说“谢谢”的更好方式是接受答案并投票(你的投票还不算,但如果你有15次以上的投票,请稍后再投票)。您可以通过单击“v”来接受答案"
使其变为绿色。stackoverflow上的一个好习惯是,如果它解决了您的问题,不要忘记接受答案。什么行?您没有显示任何行。我们需要一个文件示例,我建议您过滤您想要的行。看看这可能会给您一个提示,告诉您如何以方便的方式进行此操作。此外,我会记录我想用正则表达式过滤那些行,比如None!=re.match(“^No[0-9][^0-9]”,line)
你写:“现在我想让从第二局开始的行变成第三局…”
,但是在文件中没有第三局…这不是我的观点,但对我来说是有意义的:。说“谢谢”的更好方式是接受答案并投票(你的向上投票还不算在内,但如果你有15次以上的重复,以后再算)。你可以点击“v”接受答案
使其变为绿色。stackoverflow上的一个好习惯是,如果答案解决了您的问题,不要忘记接受答案。您可以将“for line in file:lineNo+=1”替换为for lineNo,line in enumerate(file):
这是如何区分第1场和第2场的?@MaartenFabré这是如何区分第1场和第2场的?
它没有区别,但是…打印无一个
已经消失,代码尽可能类似于OPs代码。如果你想要第2场,你可以将范围(1,10)内的n的更改为范围(2,3)内的n的
。我担心您的答案中的代码与OPs的距离太远,使OP很难理解它是如何工作的以及为什么工作的(我将对代码的更改限制在最低限度以使其工作的原因)。您可以将“for line in file:lineNo+=1”替换为for lineNo,line in enumerate(文件):
这是如何区分第1场和第2场的?@MaartenFabré这是如何区分第1场和第2场的?
它没有区别,但是…打印无,代码尽可能类似于OPs代码。如果你想要第2场,你可以将范围(1,10)内的n的更改为范围(2,3)内的n的
。我担心您答案中的代码与OPs的距离太远,使OP很难理解它是如何工作的以及为什么工作的(我将对代码的更改限制在最低限度以使其工作的原因)。在python中,Try/except是可以接受的,不应该不惜任何代价避免。正确使用它可以给出一些非常优雅的代码。此正则表达式非常简单,可能是新来者对它们的一个很好的介绍。在这种情况下,当您想获得播放编号时,regulr表达式
更容易、正确或可读小于的值
defaultdict(list,
{1: [(2, '1. adknjkd'), (3, '2. skdi'), (4, '3. ljdij')],
2: [(7, '1. hsnfhkjdnckj'), (8, '2. sjndkjhnd and so on')]})
0 Hello and Welcome This is the list of plays being performed here
PLAY NO. 1 started at line number 1
1 PLAY NO. 1
2 1. adknjkd
3 2. skdi
4 3. ljdij
5
PLAY NO. 1 ended at line number 5
PLAY NO. 2 started at line number 6
6 PLAY NO. 2
7 1. hsnfhkjdnckj
8 2. sjndkjhnd and so on