如何在文本文件中查找和替换行?

时间:2017-02-09 23:06:40

标签: python python-3.x text-files readlines

这是我的名为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'

有人可以帮我解决问题吗?我编写的代码是否正确以产生所需的结果?

2 个答案:

答案 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