首先原谅我的英语不太好。 我也是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), 或者只是换行符中的第一个字符(状态号),因为字符串的其余部分没有变化。 我真的希望我已经很好地解释了我希望能够做到的事情。 谢谢大家!