我在名为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)
答案 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
的文件中。
但这只是一个修复。它避免了真正的问题,即你真的有一个数据库应用程序,并且你正在尝试使用文本文件来实现它。上面的代码非常适合练习,但它不健壮,不会缩放。