【发布时间】:2016-11-28 11:51:34
【问题描述】:
我只想替换文件中的最后一个字符。原因是当我写入文件时,在我写入文件的最后一点,最后包含一个额外的,。我只是不想在最后写,,而是希望尽可能用] 替换它。这是我的尝试:
reader = csv.DictReader(open(restaurantsCsv), delimiter=';')
with open(fileName, 'w+') as textFile:
textFile.write('[')
for row in reader:
newRow = {}
for key, value in row.items():
if key == 'stars_count' or key == 'reviews_count':
newRow[key] = float(value)
else:
newRow[key] = value
textFile.write(json.dumps(newRow) + ',')
textFile.seek(-1, os.SEEK_END)
textFile.truncate()
textFile.write(']')
一切正常,直到我到达textFile.seek(-1, os.SEEK_END),我想在其中寻找文件的结尾,我想删除文件中的最后一个,,但我收到一条错误消息io.UnsupportedOperation: can't do nonzero end-relative seeks。因此,我这样做是为了让我的文件以wb+ 参数打开,但如果我这样做,那么我只能将字节写入我的文件,而不是字符串。有什么办法可以简单地将文件中的最后一个字符替换为] 而不是,?我知道我可以简单地打开文件进行读取,截断文件,然后再次打开文件以写入最后一个],但这似乎效率低下(如此处所示):
with open(filename, 'rb+') as filehandle:
filehandle.seek(-1, os.SEEK_END)
filehandle.truncate()
with open(filename, 'a') as filehandle:
filehandle.write(']')
任何帮助将不胜感激。谢谢!
【问题讨论】:
-
,来自哪里?生成文件的代码在哪里?我建议不要返回覆盖文件的最后一个字符,而是首先防止问题发生。解决原因,而不是症状。 -
@Chris 它实际上来自这里:
textFile.write(json.dumps(newRow) + ',')当我写入文件时,我写入文件的最后一行包含,。问题是,,应该在所有情况下都存在,除了最后一行。 -
整个文件是否应该包含有效的 JSON?不要手动构建它。您已经将
json.dumps()用于各个行;你为什么不将它用于完整输出? -
是的。您应该从源头处理错误。而不是制作它并稍后修复。 :)
-
@user1871869,如果您有一个
newRows 列表并将整个列表传递给json.dumps(),您将获得一个有效的JSON 字符串。图书馆将负责将,s、[s 和]s(和其他结构字符)放在需要去的地方。如果 that 结构包含在其他东西中,您可以将 it 传递给json.dumps()。基本上,将应该是 JSON 的整个顶级数据结构传递到json.dumps()。