【问题标题】:How to find and replace a line in a text file?如何查找和替换文本文件中的一行?
【发布时间】:2017-06-28 03:59:04
【问题描述】:

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

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

【问题讨论】:

  • 您说您遇到了一些错误。可以发在这里吗?
  • @MaLiN2223 已发布! AttributeError: 'str' object has no attribute 'readlines'
  • 您正试图将第 3 行向前移动,但该行不是迭代器,它是一个字符串,所以 readlines 在这里不起作用
  • readlines() 读取文件中的所有行,所以它是文件的方法,而不是字符串。
  • 我讨厌成为“那个人”,但你有没有考虑过不滚动你自己的数据库?在使用sqlite3 时,我看到了很多好处,而几乎没有坏处。看起来更简单、更不容易出错且更灵活。

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


【解决方案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 中,似乎存在无法替换一行文本的问题,只能附加 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 数据库中写入和读取。我希望这有帮助! ^^

【讨论】:

    【解决方案2】:

    您可能应该以不同的方式迭代您的文件,类似于:

    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

    【讨论】:

    • 这会产生以下错误AttributeError: '_io.TextIOWrapper' object has no attribute 'next'
    • 哦,我在 python 3.x 上
    猜你喜欢
    • 2014-03-05
    • 2012-11-10
    • 2015-02-24
    • 1970-01-01
    • 2014-03-05
    • 2020-07-29
    • 2018-12-31
    相关资源
    最近更新 更多