python检查并替换一个numb

2024-03-29 12:39:36 发布

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

我是python的初学者。。 我的数据线看起来像这样

2015-04-18 10 101011
2015-04-18 10 102000 
2015-04-18 20 222222
2015-04-18 20 100000

如果下面提到的字符using()是10,我想将其替换为1 如果是20的话是2

 2015-04-18 10 101011 to 2015-04-18 1 101011
 2015-04-18 20 101011 to 2015-04-18 2 101011

我一行一行地读这本书

with open("test.txt",'r') as f:

file = f.readlines()
for each in file:

我该如何在这里给出if语句


Tags: tointesttxtforaswithopen
2条回答

使用re.sub函数和替换回调的解决方案:

def shortenDigits(m):
    d = {'10': '1', '20': '2', '30': '3'}
    val = m.group(2)
    return m.group(1) + (val if val not in d else d[val])

with open('test.txt', 'r') as fh:
    lines = fh.readlines()
    replaced = [re.sub(r'^(\d{4}-\d{2}-\d{2} )(\d{2})', shortenDigits, l) for l in lines]

print(replaced)

输出:

['2015-04-18 1 101011\n', '2015-04-18 1 102000\n', '2015-04-18 2 222222\n', '2015-04-18 2 100000\n']

正则表达式是一种可能性,但可能是过度杀伤力。下面是一个使用split()的解决方案:

DATA =\
"""2015-04-18 10 101011
2015-04-18 10 102000 
2015-04-18 20 222222
2015-04-18 20 100000"""

def process_data(data):
    substitutions = {'10':'1', '20':'2', '30':'3'}
    for line in data.splitlines():
        components = line.split()
        components[1] = substitutions[components[1]]
        yield ' '.join(components)

if __name__ == '__main__':
    for line in process_data(DATA):
        print(line)

输出

2015-04-18 1 101011
2015-04-18 1 102000
2015-04-18 2 222222
2015-04-18 2 100000

假设

由于您的问题中有许多细节尚未阐明,因此我将列出我对该实现所做的假设:

  • 每一行数据中至少有一个空格(否则components[1]将导致IndexError被提升)
  • 第一个空格后面的数据将是“10”或“20”,然后是另一个空格
  • 每行中的所有空白分区都是一个单个空格Otherwise ' '.join(components)将产生一个与原稿间隔不同的行

未对输入(“10”和“20”)及其替换(“1和2”)之间的关系作出任何假设。从这个非常小的数据集来看,它看起来像f(x) = x/10,但只有你能确定。如果需要,您可以根据您的用例调整替换逻辑

相关问题 更多 >