用新输入替换文件中的数据

时间:2015-12-15 16:24:19

标签: python list file

首先,我的程序必须在每个文件中使用多个文件和10个输入,这只是一小部分,要清楚。

我的代码:

repo

之前的文件:

code = input(">> ")
print("\nPress <Enter> and parameter will be same!")

f = open("komad_namestaja.txt", "r")
allDATA = f.readlines()
f.close()
for line in allDATA:
    lst = line.split("|")

    if code == lst[0]:

        print("\nName :", lst[1])
        name = input("New Name >> ")
        if name == "":
            name = lst[1]

        f = open("komad_namestaja.txt", "r")
        allDATA = f.read()
        f.close()
        newdata = allDATA.replace(lst[1], name)
        f = open("komad_namestaja.txt", "w")
        f.write(newdata)
        f.close()

        print("\ndestination :", lst[2])
        destination = input("New destination >> ")
        if destination == "":
            destination = lst[2]

        #Writting function here

代码输入: 312

名称输入:陀螺仪

目的地输入:波兰

输入后

文件:

312|chessburger|Denmark
621|chesscake|USA

问题是这个替换文件我不能每次写7行代码,因为我有312|Gyros|Poland 621|chesscake|USA 个输入,而且我也尝试了所有东西而且无法实现这个功能。

我必须写一些函数来读/写/替换或替换最后一个之后的所有输入。

1 个答案:

答案 0 :(得分:1)

您不必每次都读取文件来修改一个字段,将其写出来,重新打开它以更改另一个字段,依此类推。这样效率很低,在你的情况下会导致代码爆炸。

由于您的文件较小,您可以立即将所有内容读入内存并在内存中处理。您的代码很容易通过dict进行映射。

这是一个采用文件名并将文件转换为字典的函数。

def create_mapping(filename):
    with open(filename, 'r') as infile:
        data = infile.readlines()
        mapping = {int(k): (i,d) for k,i,d in 
                   (x.strip().split('|') for x in data)}
    # Your mapping now looks like
    # { 312: ('cheeseburger', 'Denmark'),
    #   621: ('chesscake', 'USA') }
    return mapping

然后你可以从用户输入更新映射,因为它只是一个字典。

一旦你想要写出文件,你可以通过迭代键并使用|重新加入所有元素来序列化你的词典。

如果您想使用list s

如果您想坚持只使用list s,那是可能的。

我仍然建议您将文件读入列表,如下所示:

def load_file(filename):
    with open(filename, 'r') as infile:
        data = infile.readlines()
        items = [(int(k), i, d) for k,i,d in
                 (x.strip().split('|') for x in data]
        # Your list now looks like
        # [(312, 'cheeseburger', 'Denmark'), (621, 'chesscake', 'USA')]
    return items

然后当你得到一些用户输入时,你必须遍历列表并找到你想要的元组。

例如,假设用户输入了code 312,您可以在元组列表中找到包含312值的元组:

items = load_file(filename)

# Get input for 'code' from user
code = int(input(">> "))

# Get the position in the list where the item with this code is
try: 
    list_position = [item[0] for item in items].index(code)
    # Do whatever you need to (ask for more input?)
    # If you have to overwrite the element, just reassign its
    # position in the list with
    # items[list_position] = (code, blah, blah)
except IndexError:
    # This means that the user's entered code wasn't entered
    # Here you do what you need to (maybe add a new item to the list),
    # but I'm just going to pass
    pass