首先,我的程序必须在每个文件中使用多个文件和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
个输入,而且我也尝试了所有东西而且无法实现这个功能。
我必须写一些函数来读/写/替换或替换最后一个之后的所有输入。
答案 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