我想用列表替换文件的某个列 - Python

时间:2017-01-15 15:34:04

标签: python

我有一个看起来像这样的股票文件:

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

2 个答案:

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