如何使用python3保存对文件的更改?(替换一行字符串并将其写回文件中的相同位置)

时间:2017-12-07 18:41:36

标签: python-3.x

首先原谅我的英语不太好。 我也是Python编码的初学者。(我为pic微软组装) 我花了几个小时寻找正确的答案,但找不到任何能解决我的问题。 所以, 我有一个包含这样的行的文件: (文件名是users.dat)

1,123235122,Name
1,044235211,Name
2,264258147,Name
etc
etc...
end

每行开头的数字是状态编号,那些是我想要更改的数字,这里是: 我已经建立了两个读卡器单元,当读卡时,读卡器发送一个unitid(也是1或2),","以及由9个字符组成的卡ID号(例如:264258147)。(实际接收的数据流例如是:b' 1,264258147') 代码逐行读取文件,检查字符串,     如果cardid ==(第[2:11]行): 当匹配时,将unitid数与该行开头的状态号进行比较。 如果发送的单元ID号为1,并且在文件中状态号为2,则状态也需要更改为1,并保存回文件,保存到之前的同一行。如果unit id为2且状态为1.(如果单元ID号不等于状态号,则状态号必须改变以匹配单元ID号)如果旧行将被删除无关紧要,无论如何代码使用更改的状态编号生成整个字符串。我留下的唯一问题是如何将更改的行写回到它来自的文件(到同一个文件)。 我找到了几个解释,将新修改的行保存到新文件中,但这不是我需要的,并没有解决我的问题。 以下是从读卡器读取数据,检查匹配的ID并回复读取器的代码,但不会将更改的数据写回文件。在构建的实际硬件上进行了测试。(我想(我猜...)可能fileinput方法不是可行的方法,但是,这样做的正确方法是什么?)

#!/usr/bin/env python3
import serial
import fileinput    # https://docs.python.org/3.6/library/fileinput.html
ser = serial.Serial(port='/dev/ttyUSB0',baudrate = 9600)

while 1:   # Endless loop, wait for serial data
    incoming=ser.read(11)    # Read 11 bytes
    s= str(incoming)    #
    print(s)
    cardid=(s[4:13]) # extract card id to cardid
    unitid=int(s[2]) # extract unitid, convert it to integer
    print('Card ID=',cardid) # Print both values just to be sure
    print('Unit ID=',unitid)
#----------------------------------------------------
    for line in fileinput.input(['users.dat']): 
        if cardid ==(line[2:11]):  # compare cardid to number in current line
            user=(line[12:]) 
            status=int(line[0]) 
            print('Status:',(status))
            print('User`s name:',(user)) 
            if unitid == status :
                if unitid==1:
                    print('Already checked IN')
                    print(line)
                    ser.write(b'\xAB') #Return message to cardreader unit(already checked in or out)
                    fileinput.close()  
                    break  
                if unitid == 2:
                    print('Already checked OUT')
                    print(line)
                    ser.write(b'\xAB') # Return message to cardreader unit(already checked in or out)
                    fileinput.close()
                    break
            if unitid!= status:
                if unitid==1:
                    print('Check in succesful!')
                    print(line)
                    newline = ('1,'+ cardid + ','+ user) # THE LINE THAT SHOULD REPLACE THE OLD LINE IN users.dat
                    print(newline)
                    ser.write(b'\xAA') #Return message to cardreader unit(success)
                    fileinput.close()
                    break  
                if unitid == 2:
                    print('Check out succesful')
                    print(line)
                    newline = ('2,'+ cardid + ','+ user) # THE LINE THAT SHOULD REPLACE THE OLD LINE IN users.dat
                    print(newline)
                    ser.write(b'\xAA') # Return message to cardreader unit(success)
                    fileinput.close()
                    break
        else:         
            if (line[0:3]) =='end':
                fileinput.close()
                print('Unknown card!') 
                ser.write(b'\xAC') # Return message to cardreader unit(Card not in database)

所以,问题是:如何将换行内容写回原始文件(users.dat), 或者只是换行符中的第一个字符(状态号),因为字符串的其余部分没有变化。 我真的希望我已经很好地解释了我希望能够做到的事情。 谢谢大家!

0 个答案:

没有答案