通过读取特定字符“:”的左侧来删除行?

2024-09-30 20:24:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个100行的文本文件,如下所示:

hsh:222
shhhshshs:2294
sjasda:2324
s_s:223
aaa:111
asdasd:1111

我想删除冒号前超过3个字符的所有行,以便输出为:

hsh:222
s_s:223
aaa:111

我该怎么做?我不知道如何在冒号前向左读。我假设是这样的:

for x in f:
    newline = x.strip()+.split(':')
    if len(newline.rstrip()) >= 3:
        f2.write(newline)

Tags: inforlenifnewlinesplitstrip文本文件
3条回答

我会利用列表理解进行过滤。您可以使用str类的find()方法来查找每个单词中冒号的索引,然后将单词从开头分割到冒号索引

list_ = ['hsh:222', 'shhhshshs:2294', 'sjasda:2324', 's_s:223', 'aaa:111', 'asdasd:1111']
output = [word for word in list_ if len(word[:word.find(':')]) <= 3]
# output content: ['hsh:222', 's_s:223', 'aaa:111']

在我看来,您希望将output列表的内容写入一个文件(f2)。您可以按如下方式执行此操作:

print(*output, file=f2, sep='\n')

我不得不对我的答案做一些修改。您可以尝试使用这两行获得相同的结果。假设每行至少有2个字符

with open("xyz.txt", "r") as f, open("out.txt", 'w') as f2:
    for x in f:
        if x[3] == ':': f2.write(x)

下面的代码将解决这个假设。无论每行的长度如何,它都应该能够读取文件

import re
with open("xyz.txt", "r") as f, open("out.txt", 'w') as f2:
    for x in f:
        if re.search('^...:',x): f2.write(x)

reg表达式将检查x的值是否以任何3个字符开头,后跟冒号(:)。如果是,则该行已准备好写入文件

我在xyz.txt中的输入文件有以下记录

hsh:222
shhhshshs:2294
sjasda:2324
s_s:223
aaa:111
asdasd:1111
a:

out.txt中的outut文件具有以下记录

hsh:222
s_s:223
aaa:111

如果要检查以下模式中的任何字符串: :123a:123aa:123aaa:123

如果a可以是任何字符,则可以按如下方式更改代码:

with open("xyz.txt", "r") as f, open("out.txt", 'w') as f2:
    for x in f:
        if ':' in x[:3] : f2.write(x)

在这里,它将检查前4个位置中的:

您可以使用正则表达式编写,如下所示:

import re
with open("xyz.txt", "r") as f, open("out.txt", 'w') as f2:
    for x in f:
        if re.search('^.{0,3}:',x): f2.write(x)

如果输入文件如下所示:

hsh:222
shhhshshs:2294
sjasda:2324
s_s:223
aaa:111
asdasd:1111
a:
:1

输出结果如下:

hsh:222
s_s:223
aaa:111
a:
:1

你快到了。您可以直接对方法的结果调用方法:

elements = x.strip().split(':')

这将返回两个元素的列表。要获取列表的第一个元素,请为其编制索引:

first = elements[0]

或作为一个班轮:

first = x.strip().split(':')[0]

那就照常进行吧。请记住,您应该将x写入输出if len(first) <= 3,而不是newline或先写入

相关问题 更多 >