我只想替换文件中的最后一个字符。原因是因为当我写入文件时,在写入文件的最后一点,最后,包含了一个额外的内容。我只是不想,在最后写那个,而是想]尽可能用 a 替换它。这是我的尝试:
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(']')
Run Code Online (Sandbox Code Playgroud)
一切正常,直到我到达textFile.seek(-1, os.SEEK_END)我想要查找文件末尾的位置并且我想删除,文件中的最后一个,但是我收到一条错误消息,说io.UnsupportedOperation: can't do nonzero end-relative seeks. 因此,我这样做是为了让我的文件用wb+参数打开,但如果我这样做,那么我只能将字节写入我的文件,而不是字符串。有什么办法可以简单地用 a]而不是a替换文件中的最后一个字符,?我知道我可以简单地打开文件进行读取,截断文件,然后再次打开文件以写入最后一个,]但这似乎效率低下(如下所示):
with open(filename, 'rb+') as filehandle:
filehandle.seek(-1, os.SEEK_END)
filehandle.truncate()
with open(filename, 'a') as filehandle:
filehandle.write(']')
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激。谢谢!
您可以稍微修改您的方法,而不是在每行末尾附加逗号,只需在除第一行之外的每一行前面添加一个逗号:
reader = csv.DictReader(open(restaurantsCsv), delimiter=';')
with open(fileName, 'w+') as text_file:
text_file.write('[')
for index, row in enumerate(reader):
new_row = {}
for key, value in row.items():
if key in ('stars_count', 'reviews_count'):
new_row[key] = float(value)
else:
new_row[key] = value
if index != 0:
text_file.write(',')
text_file.write(json.dumps(new_row))
text_file.write(']')
Run Code Online (Sandbox Code Playgroud)
正如@Chris所建议的,将所有新行累积在列表中,然后将所有这些行写入一次。那么你就不会有那个讨厌的悬挂逗号了。
......
rows = []
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
rows.append(newRow)
textFile.write(json.dumps(rows))
Run Code Online (Sandbox Code Playgroud)