【发布时间】:2013-09-17 21:46:54
【问题描述】:
对于西班牙语的代码,我很抱歉,但除此之外,你应该能够理解它的结构,我使用的是 Python 3.3.2,在这里遇到了问题。
leyendoestadisticas = open("listas\Estadisticas.txt", "r")
bufferestadisticas = leyendoestadisticas.read()
leyendoestadisticas.close()
if not '"'+user.name+'"' in bufferestadisticas: #If name is not found, do this
escribiendoestadisticas = open("listas\Estadisticas.txt", 'a')
escribiendoestadisticas.write(json.dumps([user.name, palabrasdelafrase, letrasdelafrase,
"1", user.nameColor, user.fontColor, user.fontFace, user.fontSize, message.body, room.name])+"\n")
escribiendoestadisticas.close()
else: #If name is found...
data = []
with open('listas\Estadisticas.txt', 'r+') as f:
for line in f:
data_line = json.loads(line)
if data_line[0] == user.name: #if name matches...
if data_line[9] == room.name: #And room also, then update info.
data_line[1] = int(data_line[1])+int(palabrasdelafrase)
data_line[2] = int(data_line[2])+int(letrasdelafrase)
data_line[3] = int(data_line[3])+1
data_line[4] = user.nameColor
data_line[5] = user.fontColor
data_line[6] = user.fontFace
data_line[7] = user.fontSize
data_line[8] = message.body
data_line[9] = room.name
else: #but if name is found and room doesn't matches. #PROBLEM HERE
escribiendoestadisticas = open("listas\Estadisticas.txt", 'a')
escribiendoestadisticas.write(json.dumps([user.name, palabrasdelafrase, letrasdelafrase,
"1", user.nameColor, user.fontColor, user.fontFace, user.fontSize, message.body, room.name])+"\n")
escribiendoestadisticas.close()
data.append(data_line)
break
f.seek(0)
f.writelines(["%s\n" % json.dumps(i) for i in data])
f.truncate()
它的目的是添加一个 user.name 并更新它的信息,只要该行的属性 9 匹配。如果不匹配,则使用相同的 user.name 但属性 9 的新值将新行添加到列表中。
如果属性 9 匹配,它会完美运行,但如果不匹配,它所做的是覆盖该 user.name 的现有值并开始计算 [1]、[2] 和 [3] 中的属性从头开始。
感谢您的帮助。
编辑:使用答案中的信息进行更新:
else:
data = []
with open('listas\Estadisticas.txt', 'r+') as f:
lines = f.readlines()
for line in lines:
data_line = json.loads(line)
if data_line[0] == user.name:
if data_line[9] == room.name:
data_line[1] = int(data_line[1])+int(palabrasdelafrase)
data_line[2] = int(data_line[2])+int(letrasdelafrase)
data_line[3] = int(data_line[3])+1
data_line[4] = user.nameColor
data_line[5] = user.fontColor
data_line[6] = user.fontFace
data_line[7] = user.fontSize
data_line[8] = message.body
data_line[9] = room.name
data.append(data_line)
f.seek(0)
f.writelines(["%s\n" % json.dumps(i) for i in data])
f.truncate()
for line in lines:
data_line = json.loads(line)
if data_line[0] == user.name:
if not data_line[9] == room.name:
escribiendoestadisticas = open("listas\Estadisticas.txt", 'a')
escribiendoestadisticas.write(json.dumps([user.name, palabrasdelafrase, letrasdelafrase,
"1", user.nameColor, user.fontColor, user.fontFace, user.fontSize, message.body, room.name])+"\n")
escribiendoestadisticas.close()
但现在我收到错误:ValueError: I/O operation on closed file。 完全迷路了。
【问题讨论】:
-
您是要即时追加到文件中,还是在最后重写整个文件?你肯定不想两者都做。
-
我不确定最里面的
else条件是否有意义。如果一个用户名可以在文件中多次使用不同的房间号,您可能希望搜索整个文件,直到找到匹配的房间,而不是在找到第一个匹配的名称后中断。 -
是的,现在注意到了,它应该只用于一个房间,所以整个列表中只有 1 个同名用户。但是现在我正在升级它以允许几个相同的 user.names 只是在 value[9] 中具有不同的房间并且......我迷路了。
-
@abarnert 我想即时追加文件。