我有一个看起来像这样的股票文件:
12334232:seat belt:2.30:12:10:30
14312332:toy card:3.40:52:10:30
12512312:xbox one:5.30:23:10:30
12543243:laptop:1.34:14:10:30
65478263:banana:1.23:23:10:30
27364729:apple:4.23:42:10:30
28912382:orange:1.12:16:10:30
12892829:elephant:6.45:14:10:30
我想替换第四列中的项目,如果它们在某个事务处理后的第五列中的数字低于sxith列中的数字。我该如何更换第四栏中的项目? 每次我使用下面的代码行时,它都会覆盖整个文件(删除所有内容)
for line in stockfile:
c=line.split(":")
print("pass")
if stock_order[i] == User_list[i][0]:
stockfile.write(line.replace(current_stocklevel_list[i], reorder_order[i] ) )
else:
i = i + 1
我希望stockfile在替换列中的必要项之后看起来像这样:
12334232:seat belt:2.30:30:10:30
14312332:toy card:3.40:30:10:30
12512312:xbox one:5.30:30:10:30
12543243:laptop:1.34:30::10:30
65478263:banana:1.23:30:10:30
27364729:apple:4.23:30:10:30
28912382:orange:1.12:30:10:30
12892829:elephant:6.45:30:10:30
答案 0 :(得分:0)
如果您在一段时间后打开文件,则应使用" a" (追加)作为一种模式,这样文件就不会被截断。
写指针将自动出现在文件末尾。
所以:
f = open("filename", "a")
f.seek(0) # To start from beginning
但是如果你想读写,那么添加" +"模式和文件也不会被截断。
f = open("filename", "r+")
读取和写入指针都位于文件的开头,您只需要寻找您希望开始写入/读取的位置。
但你做错了。
请参阅,文件的内容将被覆盖,不会自动插入。
如果您处于可写模式,则会在文件末尾添加内容。
因此,您需要加载整个文件,进行所需的更改并将所有内容写回来。
或者,您必须在某个时刻写入更改,如果内容比之前更短,则必须将剩余内容移到截断文件中。
mmap模块可以帮助您将文件视为字符串。您将能够有效地移动数据并调整文件大小。
但是,如果您确实想要更改文件,则应该使用具有固定长度列的文件。因此,当您想要更改值时,您无需来回移动任何内容。找到正确的行和col,寻找那里,在旧的上面写一个新值(确保删除所有旧的),就是这样。
答案 1 :(得分:0)
您应该首先尝试读取数据:
with open('inputfile', 'r') as infile:
data = infile.readlines()
然后你可以循环数据并根据需要进行编辑并写出来:
with open('outputfile', 'w') as outfile:
for line in data:
c = line.split(":")
if random.randint(1,3) == 1:
# update fourth column based on some good reason
c[3] += 2
outfile.write(':'.join(c) + '\n')
或者你可以使用类似的东西:
with open('inputfile', 'r') as infile, open('outputfile', 'w') as outfile:
line = infile.readline()
c = line.split(":")
if random.randint(1,3) == 1:
# update fourth column based on some good reason
c[3] += 2
outfile.write(':'.join(c) + '\n')
os.rename('outputfile', 'inputfile')