这是我的名为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'
有人可以帮我解决问题吗?我编写的代码是否正确以产生所需的结果?
答案 0 :(得分:1)
当您将文本文件配置为键时,这会容易得多:值对(如python中的dict
构造,或SQL中的其他DB中的值)。然后,您可以在满足该值时设置一个标记值,然后在您更换正确的行时取消设置。
因此,如果将文本格式更改为:
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
它有点脏,肯定可以清理,但它更冗长。另请注意,空格很重要,因为它在分割线时用作分隔符。
您可能还注意到我没有写入该文件:至少在python 2.7中,我似乎有一个问题,我不能替换一行文本,只附加{{ 1}}。此代码可以工作并替换为stdout,写入文件的解决方法是将所有行写入新文件:
f.write()
然后您可以根据需要编写逻辑来替换文件。但是,我非常建议查看如何从实际的SQL数据库写入和读取。我希望这有帮助! 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
答案 1 :(得分:0)
你应该以不同的方式迭代你的文件,类似于:
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