【问题标题】:Easy way to replace last character in file?替换文件中最后一个字符的简单方法?
【发布时间】: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()

标签: python file-io


【解决方案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(']')

【讨论】:

    【解决方案2】:

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

    看看它是否正常工作

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

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

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

    在 python 中运行

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

    【讨论】:

    • 如果可能的话,我想要一种使用我的 python 脚本来自动化它的方法。谢谢。
    • 如果它对你有用,那么你可以在 python 中使用 os.system() 函数来使用相同的命令。
    【解决方案3】:

    按照@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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 2012-05-23
      • 2011-04-11
      相关资源
      最近更新 更多