2017-02-09 87 views
1

这是我的数据库名为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

你说你得到一些错误。你可以在这里发布吗? – MaLiN2223

+0

@ MaLiN2223发布了! 'AttributeError的:“海峡”对象有没有属性“readlines'' –

+0

您要3线前进路线,但心不是行的迭代器,它是一个字符串,所以readlines方法行不通这里 – Nullman

回答

1

这是一个更容易wh您可以将您的文本文件配置为键值对(例如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 

这是一个有点脏,肯定可以被清理,但它更详细。另外,请注意,分隔线条时,空格很重要,因为它用作分隔符。

您可能还注意到我没有写入文件:至少对于我在Python 2.7中,似乎有一个问题,我无法替换一行文本,只能附加f.write()。此代码的工作,取代到stdout,用于写入文件的解决方法是简单地写所有行到一个新的文件:

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数据库进行编写和读取。我希望这有帮助! ^^

0

你应该遍历文件不同,沿着线的东西:

database = open('myDB.txt','r+') 
while(str(userCode) not in next(database)): 
    pass 
else: 
    for i in range(3): line = next(database) 

上面的线是由大卫Hoksza

在这一点上,你应该在所需的行 IM启发100%肯定有一个更好的pythonic这样做的方式,但我没有太多的经验,在蟒蛇文件操作 我认为这应该工作在Python 3

+0

此更换下一个3线产生以下错误'AttributeError的:“_io.TextIOWrapper”对象有没有属性“next'' –

+0

陌生,它为我工作。即时通讯蟒蛇2 – Nullman

+0

哦,我在python 3.x –

相关问题