2017-02-09 96 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 –