我正在为学校做作业并且已经撞墙了。
挑战是:
您将传递文件名P,名字F,姓氏L和新生日B.
在P中加载固定长度记录文件,在第一个中搜索F,L并将生日更改为B.
然后保存文件。
我已设法从文件中读取并将数据拆分为列表中的所需条目。 但是,当我在列表中搜索名字和姓氏时,我的问题出现了。 传递的名字和姓氏是亚当·斯密,但是我的代码也找到了名单中的亚当史密瑟斯。当我尝试替换列表中的所需元素时,它将替换Smith和Smithers。
我们不能使用正则表达式进行赋值,所以我对如何处理它并找到与姓氏完全匹配而忽略包含Smith的其他姓氏而不使用正则表达式有点遗憾。
这是我的代码:
import sys
P= sys.argv[1]
F= sys.argv[2]
L= sys.argv[3]
B= sys.argv[4]
filePath = P
firstName = F
lastName = L
newBirthday = B
records = []
file1 = open(filePath, 'r')
fileContent = file1.read()
while len(fileContent) > 0:
record = []
fname = fileContent[0:16]
lname = fileContent[16:32]
bday = fileContent[32:40]
record = [fname,lname,bday]
records.append(record)
fileContent = fileContent[40:]
for record in records:
if firstName in record[0] and lastName in record[1]:
record[2] = newBirthday
file1.close()
file2 = open(filePath, 'w')
for record in records:
file2.write(record[0])
file2.write(record[1])
file2.write(record[2])
file2.close()
任何有人能提供的想法或提示都将受到最高的赞赏。
谢谢!
编辑:
冰酒很友好,建议使用以下代替:
if firstName == record[0] and lastName == record[1]:
但是,当我尝试时,它找不到任何匹配的记录。
我相信这是因为每个名称后面都有空格,每个名称中包含16个字符,为名称提供固定长度。因此,当我使用==运算符时,它找不到完全匹配,因为名称中也有空格,因此它不是完全匹配。
使用==而不是in
if firstName == record[0] and lastName == record[1]:
编辑:试试这个
从字符串末尾删除空格
if firstName.rstrip() == record[0].rstrip() and lastName.rstrip() == record[1].rstrip()
要么
从字符串的开头和结尾删除空格
if firstName.strip() == record[0].strip() and lastName.strip() == record[1].strip()
修剪字符串中的空格,然后使用==
进行匹配。这将给出预期的输出。示例代码
for record in records:
if firstName == record[0].strip() and lastName == record[1].strip():
record[2] = newBirthday
在传递的数据上填充空格以匹配文件中的内容:
firstName = f'{F:<16}'
或者从文件内容中删除多余的空格以匹配传递的数据:
fname = fileContent[0:16].strip()
那么您可以简单地比较名称,保持in
运算符或使用==
。
一个简单的解决方案是对名称和值列表进行排序(在这种情况下,生日(我建议您为此目的使用字典),然后执行仅查找元素第一次出现的搜索操作。只选择了Adam Smith
。
然后,您可以通过检查下一个元素是否与您找到的元素相同来进一步处理重复项。
即如果第一次出现是i
,检查是否i+1 == i
,并更新所有重复项。 (这可能是你需要为锻炼做的事情,尽管更新其他人的生日是没有意义的。)
希望这有助于:)
以下是我可以为您的代码建议的一些改进:
if __name__ == '__main__':
中。你可以谷歌为什么。with open(file_path, 'r') as f:
来读写文件;它看起来更干净,你不会忘记关闭文件。line[:16].strip()
这是我的代码版本:
f.write('{:16s}{:16s}{:8s}'.format(*record))
这对你有用吗?
注意:此代码不按换行符分割行,但它当时读取40个字符,因此您最终可能会在这40个字符中使用换行符。
我是这样做的,因为问题中的代码似乎做了类似的事情。