如何查找和替换文本文件中的一行?
How to find and replace a line in a text file?
这是我的数据库 myDB.txt
:
28273139
iPhone
5.50
30
5
35
81413852
Book
1.50
43
10
55
文本文件数据库遵循格式
Product Code
Product Name
Price
Current Stock
Reorder Stock (the lowest the stock can go)
Target Stock
现在,我想更新 iPhone 数据。
这是 iPhone 数据。
28273139
iPhone
5.50
30
5
35
它使用8位产品代码来识别产品。
我写了下面的代码
userCode = "28273139"
newstock = "29"
database = open('myDB.txt','r+')
while(str(userCode) not in next(database)):
pass
else:
for i in range(3):
line = next(database)
replace = line.replace(line,newstock)
database.write(replace)
我想将列表的第 4 个值,即数字 30 更改为数字 29,我将其声明为变量 newstock。
该程序向下移动 3 行,因为格式对于数据库中的每个产品都是相同的,并用这个新值替换该行。
我需要更新 iPhone 数据的结果 -
28273139
iPhone
5.50
29
5
35
但是,这个方法行不通。
我每次都收到错误。
AttributeError: 'str' object has no attribute 'readlines'
有人可以帮助解决我的问题吗?我编写的代码是否正确以产生所需的结果?
您可能应该以不同的方式遍历您的文件,类似于:
database = open('myDB.txt','r+')
while(str(userCode) not in next(database)):
pass
else:
for i in range(3): line = next(database)
上面这行的灵感来自 David Hoksza
此时你应该在想要的行
我 100% 确定有更好的 pythonic 方法来执行此操作,但我在 python 中没有太多文件操作经验
我认为这应该适用于 python 3
当您将文本文件配置为 key:value 对(如 python 中的 dict
结构或另一个数据库中的值如 SQL).然后您可以在满足该值时简单地设置一个标记值,然后在替换正确的行后取消设置。
因此,如果将文本格式更改为:
ProductCode <value>
ProductName <value>
Price <value>
CurrentStock <value>
ReorderStock <value>
Targetstock <value>
那么你可以这样做:
ProductCode = "28273139"
NewStock = "29"
SentinelValue = 0
with open('myDB.txt', 'r+') as database:
for line in database:
(key, val) = line.split()
if key == "ProductCode":
if val == ProductCode:
SentinelValue = 1
if key != "ProductCode":
if key == "CurrentStock":
if SentinelValue == 1:
line = line.replace(val, NewStock)
print line
它有点脏,当然可以清理,但它更冗长。另外,请注意 space 很重要,因为它在拆分行时用作分隔符。
您可能还注意到我没有写入文件:至少对 python 2.7 中的我来说,似乎有一个问题,我无法替换一行文本,只能附加f.write()
。此代码有效并替换为标准输出,写入文件的解决方法是简单地将所有行写入新文件:
ProductCode = "28273139"
NewStock = "29"
SentinelValue = 0
fout = open('newDB.txt', 'w')
with open('myDB.txt', 'r+') as database:
for line in database:
(key, val) = line.split()
if key == "ProductCode":
if val == ProductCode:
SentinelValue = 1
if key != "ProductCode":
if key == "CurrentStock":
if SentinelValue == 1:
line = line.replace(val, NewStock)
fout.write(line)
print line
然后您可以编写逻辑来根据需要替换文件。但是,我非常建议查看如何写入和读取实际的 SQL 数据库。我希望这有帮助! ^^
这是我的数据库 myDB.txt
:
28273139
iPhone
5.50
30
5
35
81413852
Book
1.50
43
10
55
文本文件数据库遵循格式
Product Code
Product Name
Price
Current Stock
Reorder Stock (the lowest the stock can go)
Target Stock
现在,我想更新 iPhone 数据。 这是 iPhone 数据。
28273139
iPhone
5.50
30
5
35
它使用8位产品代码来识别产品。
我写了下面的代码
userCode = "28273139"
newstock = "29"
database = open('myDB.txt','r+')
while(str(userCode) not in next(database)):
pass
else:
for i in range(3):
line = next(database)
replace = line.replace(line,newstock)
database.write(replace)
我想将列表的第 4 个值,即数字 30 更改为数字 29,我将其声明为变量 newstock。 该程序向下移动 3 行,因为格式对于数据库中的每个产品都是相同的,并用这个新值替换该行。
我需要更新 iPhone 数据的结果 -
28273139
iPhone
5.50
29
5
35
但是,这个方法行不通。
我每次都收到错误。
AttributeError: 'str' object has no attribute 'readlines'
有人可以帮助解决我的问题吗?我编写的代码是否正确以产生所需的结果?
您可能应该以不同的方式遍历您的文件,类似于:
database = open('myDB.txt','r+')
while(str(userCode) not in next(database)):
pass
else:
for i in range(3): line = next(database)
上面这行的灵感来自 David Hoksza
此时你应该在想要的行 我 100% 确定有更好的 pythonic 方法来执行此操作,但我在 python 中没有太多文件操作经验 我认为这应该适用于 python 3
当您将文本文件配置为 key:value 对(如 python 中的 dict
结构或另一个数据库中的值如 SQL).然后您可以在满足该值时简单地设置一个标记值,然后在替换正确的行后取消设置。
因此,如果将文本格式更改为:
ProductCode <value>
ProductName <value>
Price <value>
CurrentStock <value>
ReorderStock <value>
Targetstock <value>
那么你可以这样做:
ProductCode = "28273139"
NewStock = "29"
SentinelValue = 0
with open('myDB.txt', 'r+') as database:
for line in database:
(key, val) = line.split()
if key == "ProductCode":
if val == ProductCode:
SentinelValue = 1
if key != "ProductCode":
if key == "CurrentStock":
if SentinelValue == 1:
line = line.replace(val, NewStock)
print line
它有点脏,当然可以清理,但它更冗长。另外,请注意 space 很重要,因为它在拆分行时用作分隔符。
您可能还注意到我没有写入文件:至少对 python 2.7 中的我来说,似乎有一个问题,我无法替换一行文本,只能附加f.write()
。此代码有效并替换为标准输出,写入文件的解决方法是简单地将所有行写入新文件:
ProductCode = "28273139"
NewStock = "29"
SentinelValue = 0
fout = open('newDB.txt', 'w')
with open('myDB.txt', 'r+') as database:
for line in database:
(key, val) = line.split()
if key == "ProductCode":
if val == ProductCode:
SentinelValue = 1
if key != "ProductCode":
if key == "CurrentStock":
if SentinelValue == 1:
line = line.replace(val, NewStock)
fout.write(line)
print line
然后您可以编写逻辑来根据需要替换文件。但是,我非常建议查看如何写入和读取实际的 SQL 数据库。我希望这有帮助! ^^