轻松替换文件中的最后一个字符?

时间:2016-11-28 02:38:52

标签: python file-io

我只想替换文件中的最后一个字符。原因是当我写入我的文件时,在我写入文件的最后一点,最后包含一个额外的,。我只是不想在最后写,,而是希望在可能的情况下用]替换它。这是我的尝试:

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 1}}。因此,我这样做是为了使我的文件以wb+参数打开,但如果我这样做,那么我只能将字节写入我的文件,而不是字符串。有没有什么办法可以用]而不是,来替换我文件中的最后一个字符?我知道我可以简单地打开文件来读取,截断文件,然后再次打开文件写下最后的],但这似乎效率低下(如下所示):

   with open(filename, 'rb+') as filehandle:
     filehandle.seek(-1, os.SEEK_END)
     filehandle.truncate()

   with open(filename, 'a') as filehandle:
    filehandle.write(']')

任何帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:2)

替换文件的最后一个字符,即最后一行的最后一个字符。

查看其是否正常工作

sed '$ s/.$/]/' file_name

替换最后一行的最后一个字符,即你的情况下用逗号替换']'并更改文件。

sed -i '$ s/.$/]/' file_name

从python中运行

import os
print os.system("sed -i '$ s/.$/]/' file_name")

答案 1 :(得分:1)

根据@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))

答案 2 :(得分:1)

你可以稍微修改一下你的方法,而不是在每一行的末尾添加一个逗号,你只需在第一行前面添加一个逗号:

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(']')