pythonpython-3.xfile-manipulation

replace first character of each line in file python


I am trying to replace some of the first characters in lines from multiple txt files and have this code but the output is wrong:

for filename in glob.glob('./labels/**/*.txt', recursive=True):
with open(filename, 'r') as f:
    original_lines = f.readlines()
with open(filename, 'w') as out:
    for line in original_lines:
        if line.startswith('0'):
            line0 = line
            out.write(line0)
        if line.startswith('1'):
            line1 = line
            out.write(line1)
        if line.startswith('2'):
            line2 = line
            out.write(line2)
        if line.startswith('3'):
            line3 = line
            out.write(line3)
        if line.startswith('5'):
            line4 = '4' + line[1:]
            out.write(line4)
        if line.startswith('7'):
            line5 = '5' + line[1:]
            out.write(line5)
        if line.startswith('9'):
            line6 = '6' + line[1:]
            out.write(line6)
        if line.startswith('10'):
            line7 = '7' + line[1:]
            out.write(line7)
        if line.startswith('11'):
            line8 = '8' + line[1:]
            out.write(line8)
        if line.startswith('12'):
            line9 = '9' + line[1:]
            out.write(line9)

So if I have a file like this:

0 0.2 0.4 0.8

12 0.1 0.1 0.25

7 0.66 0.80 0.91

I want output to be:

0 0.2 0.4 0.8

9 0.1 0.1 0.25

5 0.66 0.80 0.91


Solution

  • I think you have some slicing issues for example lets say your input is 12 0.1 0.1 0.25 line[1:] is going to be 2 0.1 0.1 0.25 because your input is a string. You can use something like:

    line = '12 0.1 0.1 0.25'.split(' ') #convert your string to a list
    
    temp = int(line[0]) #get first element and convert to integer to make comparisons easier
    
    if temp < 3:
        print(' '.join(line))
    elif temp == 5: 
        line[0] = '4'
        print(' '.join(line))
    elif temp == 7:
        line[0] = '5'
        print(' '.join(line))
    elif temp > 8:
        line[0] =str(temp - 3)
        print(' '.join(line))
    
    #Output: 
    
    9 0.1 0.1 0.25
    
    

    Note: It's better to use elif instead of if in your case because if one of your conditions are true it is not going to check rest of the conditions. More info here