如何搜索某个人的名字,然后替换与人名相同的行中的号码?

时间:2017-08-07 15:48:53

标签: python replace find

我在名为data.txt的文件中有以下数据,并且希望能够在最后添加数字并将其替换为文件而不创建新数据:

Alfreda,art,2015,35
brook,biology,2015,3
charlie,chemistry,2015,140
dolly,Design,2015,120
Emilia,English,2015,150
Fiona,french,2015,40
Grace,Greek,2015,12
Hanna,history,2015,15

以下是我目前的代码:

with open("data.txt", "r") as f:
  newline=[]
  for word in f.line(): 
      newline.append(word.replace(35,str(New))
with open("data.txt", "w") as f:
  for line in newline :
      f.writelines(line)

2 个答案:

答案 0 :(得分:0)

如果您只想在每行添加字符串然后更新文件,此代码可以解决您的问题,但这不是最佳选择。

with open("data.txt", "r") as myFile:
  newline=[]
  # Use the readlines method to get all the lines
  for line in myFile.readlines():
      # Remove the \n character with the rstrip method
      line = line.rstrip('\n')
      newline.append(line+",35\n") # Don't forget to add \n
# Test
print newline
myFile.close()
with open("data.txt", "w") as myFile:
  for line in newline :
      myFile.writelines(line)

如果这不是您的问题,请尝试使用pickle模块并使用对象,这将更容易。

答案 1 :(得分:0)

我将不得不提出一些问题。如果您有一个文件并且想要更新它,则更新必须来自某个地方。问题中的代码有一个New变量,但没有迹象表明New应该如何获取值,或者程序应该如何知道要更新哪一行。

我将假设您有一个名为updates.txt的更新的文件,看起来像这样(故意不按字母顺序排列):

Emilia,45
Alfreda,35

因此,在程序运行后,生成的文件将有两行不同:

Alfreda,art,2015,70                                  ...this one
brook,biology,2015,3
charlie,chemistry,2015,140
dolly,Design,2015,120
Emilia,English,2015,195                              ...and this one
Fiona,french,2015,40
Grace,Greek,2015,12
Hanna,history,2015,15

但其余的一样。

由于您的示例数据文件是.csv文件,因此我使用的是Python csv模块,而不是手动分开数据。这样的简单数据并不重要,但它是一个很好的模块。

import csv
marks = {}

# Read in existing data into a dictionary:
# key is name, value is a list [subject, year, score]
# like this: {"Alfreda": ["art",2015,35], ... }  
# This is to make it easy to do random updates based on name

with open("data.txt", "r") as f:
    for row in csv.reader(f):
        name,subject,year,score = row
        marks[name] = [subject,int(year),int(score)]

# Read in updates and apply each line to the corresponding entry in marks
with open("updates.txt", "r") as f:
    for row in csv.reader(f):
        name,added_score = row
        try:
            marks[name][2] += int(added_score)  # for example marks["Alfreda"][2] += int("35")
        except KeyError:
            print(f"Name {name} not found to update, nothing done")

# Write out updated dictionary:
with open("data.txt", "w") as f:
    writer = csv.writer(f,lineterminator="\n")
    for name in sorted(marks.keys(), key=lambda n: n.lower()):
        row=[name]+marks[name]                 # for example ["Alfreda"] + ["art",2015,70]
        writer.writerow(row)

这一行:

for name in sorted(marks.keys(), key=lambda n: n.lower()):

看起来很复杂但需要它,因为你显然希望名称Alfreda brook charlie dolly Emilia Fiona Grace Hanna按顺序排列。但只是做了显而易见的

for name in sorted(marks.keys()):

会将它们放在Alfreda Emilia Fiona Grace Hanna brook charlie dolly的订单中。

为了保持代码简单并尽可能接近原始代码,它没有进行有效性检查,所以如果这一行

charlie,chemistry,2015,140

错误输入为

charlie,chemistry,2015,14O

(字母O而不是零),程序将失败。如果更新文件在某个地方缺少逗号,则同上。

这可行并将按照我的想法做。但...

设计存在问题。您的程序从data.txt读取数据,然后用新数据覆盖它。但假设您的程序在此行之后失败:

with open("data.txt", "w") as f:

然后你没有获得原始数据(因为对open()的调用截断了它),你也没有获得新数据(因为你还没有写过它)出来)。或者假设您不小心运行了两次程序。没有办法告诉你已经这样做了。

您可以使用fileinput模块为此类事故提供一些保险,如下所示:

import fileinput

# Read in existing data
with fileinput.input("data.txt", inplace=True, backup=".bkp") as f:
    for row in csv.reader(f):
        name,subject,year,score = row
        marks[name] = [subject,int(year),int(score)]

通过此更改,您的更新将与以前一样data.txt,但您的原始数据仍然存在于名为data.txt.bkp的文件中。

但这只是一个修复。它避免了真正的问题,即你真的有一个数据库应用程序,并且你正在尝试使用文本文件来实现它。上面的代码非常适合练习,但它不健壮,不会缩放。