通过截断从文件中删除最终字符

时间:2019-02-12 16:54:20

标签: python

我想删除python文本文件中的最后一个逗号。该文件如下所示:

{"time":"2019-02-12T14:41:25.2424552+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Alteraciones_Primitivas_dmz_","service":"GetAlteracion","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_85531"},"response":null,"status":200},  
{"time":"2019-02-12T14:41:25.5525828+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Expedientes_dmz_","service":"GetObligatoriedadDocumental","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_85531","tipo_alteracion":"ALT_1","id_expediente":""},"response":null,"status":400},  
{"time":"2019-02-12T14:41:25.9169746+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Alteraciones_Primitivas_dmz_","service":"Ubicar","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_85531","epsg":"EPSG:4326"},"response":null,"status":200},
{"time":"2019-02-12T14:41:29.8222248+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Alteraciones_Primitivas_dmz_","service":"GetAlteracion","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_17819"},"response":null,"status":200},  
{"time":"2019-02-12T14:41:29.9708861+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Expedientes_dmz_","service":"GetObligatoriedadDocumental","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_17819","tipo_alteracion":"ALT_1","id_expediente":""},"response":null,"status":400} ,  
{"time":"2019-02-12T14:41:30.3077709+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Alteraciones_Primitivas_dmz_","service":"Ubicar","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_17819","epsg":"EPSG:4326"},"response":null,"status":200},  
{"time":"2019-02-12T14:41:38.7145697+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Documentos_dmz_","service":"obtenerDocumento","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_17819","documento":"E000226847","control":11},"response":null,"status":200},  

我想在最后一行删除逗号。看了很多示例之后,我尝试了以下代码(以及许多类似的选项):

with open('data.txt', 'w') as f:    
    f.seek(f.tell() - 1, os.SEEK_SET)
    f.truncate()

但这不起作用。有帮助吗?

编辑

逗号和'}'之间没有空格。如果文件以逗号结尾,我们办公室中的程序(我无权访问)给出了错误。我需要的是仅删除文件最后一行中的最后一个逗号,而不是每一行中的最后一个逗号,并以这种方式返回文件:

{"time":"2019-02-12T14:41:25.2424552+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Alteraciones_Primitivas_dmz_","service":"GetAlteracion","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_85531"},"response":null,"status":200},  
{"time":"2019-02-12T14:41:25.5525828+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Expedientes_dmz_","service":"GetObligatoriedadDocumental","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_85531","tipo_alteracion":"ALT_1","id_expediente":""},"response":null,"status":400},  
{"time":"2019-02-12T14:41:25.9169746+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Alteraciones_Primitivas_dmz_","service":"Ubicar","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_85531","epsg":"EPSG:4326"},"response":null,"status":200},
{"time":"2019-02-12T14:41:29.8222248+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Alteraciones_Primitivas_dmz_","service":"GetAlteracion","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_17819"},"response":null,"status":200},  
{"time":"2019-02-12T14:41:29.9708861+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Expedientes_dmz_","service":"GetObligatoriedadDocumental","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_17819","tipo_alteracion":"ALT_1","id_expediente":""},"response":null,"status":400},  
{"time":"2019-02-12T14:41:30.3077709+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Alteraciones_Primitivas_dmz_","service":"Ubicar","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_17819","epsg":"EPSG:4326"},"response":null,"status":200},  
{"time":"2019-02-12T14:41:38.7145697+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Documentos_dmz_","service":"obtenerDocumento","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_17819","documento":"E000226847","control":11},"response":null,"status":200}

编辑2 最后,@holdenweb解决方案为我工作! :

with open('data.txt', 'ab'):
    f.seek(-1, 2)
    f.truncate()

5 个答案:

答案 0 :(得分:3)

使用此:

res = your_string.rstrip(',')

对于documentation

希望有帮助 谢谢

答案 1 :(得分:3)

您的代码不起作用,因为在写入模式下打开文件会立即将其截断为零长度。您需要添加模式,该模式将使用任何现有文件的内容。

忽略一个字节等于一个字符的假设(Unicode输入图片后并非总是这种情况),并假设文件末尾没有换行符并且您要保留空格,这应该起作用: / p>

with open('data.txt', 'ab'):
    f.seek(-1, 2)
    f.truncate()

答案 2 :(得分:2)

我注意到,并不是数据中的最后一个符号,这就是为什么您的解决方案以及rstrip(',')都无法使用的原因。请改用replace

with open('data.txt', 'r') as f:
    data = f.read().replace('} ,', '}')

with open('data.txt', 'w') as f:
    f.write(data)

此脚本删除每行的最后一个逗号(因为'} ,'仅出现在每行的末尾),您将在输出中得到以下提示:

{"time":"2019-02-12T14:41:25.2424552+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Alteraciones_Primitivas_dmz_","service":"GetAlteracion","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_85531"},"response":null,"status":200}
{"time":"2019-02-12T14:41:25.5525828+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Expedientes_dmz_","service":"GetObligatoriedadDocumental","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_85531","tipo_alteracion":"ALT_1","id_expediente":""},"response":null,"status":400}
{"time":"2019-02-12T14:41:25.9169746+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Alteraciones_Primitivas_dmz_","service":"Ubicar","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_85531","epsg":"EPSG:4326"},"response":null,"status":200}
{"time":"2019-02-12T14:41:29.8222248+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Alteraciones_Primitivas_dmz_","service":"GetAlteracion","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_17819"},"response":null,"status":200}
{"time":"2019-02-12T14:41:29.9708861+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Expedientes_dmz_","service":"GetObligatoriedadDocumental","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_17819","tipo_alteracion":"ALT_1","id_expediente":""},"response":null,"status":400}
{"time":"2019-02-12T14:41:30.3077709+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Alteraciones_Primitivas_dmz_","service":"Ubicar","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_17819","epsg":"EPSG:4326"},"response":null,"status":200}
{"time":"2019-02-12T14:41:38.7145697+01:00","ip":"::1","browser":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36","user":"28969523B","profile":"SUMUM_D?99?2017?2","controller":"Documentos_dmz_","service":"obtenerDocumento","delegacion":null,"municipio":null,"method":"GET","parameters":{"id_alteracion":"11_31_17819","documento":"E000226847","control":11},"response":null,"status":200}

答案 3 :(得分:2)

如何?

executor = ProcessPoolExecutor()

loop.run_until_complete(
    asyncio.gather(
        login_server.get_instance(),
        world_server.get_instance(),
        loop.run_in_executor(executor, WebServer.run)
    )
)

答案 4 :(得分:1)

此解决方案可找到最后一个的索引  最后一行中的},并将字符串替换为索引。

此后,可以选择重命名“新”文件。

with open("datain.txt", 'r') as f_in, open('dataout.txt', 'w') as f_out:
    last = None
    for l in f_in.readlines():
        if last:
            f_out.write(last)
        last = l
    i = last.rfind("}")
    f_out.write(last[:i+1])

您也可以执行类似的操作,但是我不知道它如何处理编码,并且循环可能受到更多限制,因此您最终不会截断整个文件。

import os
with open("datain.txt", "r+") as f:
    f.seek(0, os.SEEK_END)
    pos = f.tell()

    while pos > 0:
        f.seek(pos)
        c = f.read(1).encode('utf-8')
        if c == b'}':
            break
        pos = f.tell() - 2
    f.truncate(pos)