【问题标题】:Making the same change to every line in a BED/Interval file in python在 python 中对 BED/Interval 文件中的每一行进行相同的更改
【发布时间】:2013-06-17 15:57:11
【问题描述】:

我有一个 BED 间隔文件,我正在尝试使用 Galaxy 在线工具处理它。目前,文件中的每一行都以一个数字(代表染色体编号)开头。为了正确上传,我需要每行以“chr”开头,然后是数字。因此,例如以“2L”开头的行,我需要进行更改,以便它们以“chr2L”开头,并对以数字开头的所有其他行执行相同操作(不仅仅是 2L,还有许多不同的数字)。我在想如果我可以在每一行的开头添加一个“chr”而不影响其他列,那会很棒,但我不知道该怎么做(对python来说很新) 你能帮帮我吗?

谢谢。

【问题讨论】:

  • 您是否受限于使用 python(与 sed、awk 或 perl 等专为此类任务设计的工具相反)?
  • 例如perl -pi -e 's/^/chr/' inputfile.bde

标签: python inline-editing genome


【解决方案1】:

http://docs.python.org/2/library/stdtypes.html#file.writelines

with open('bed-interval') as f1, open('bed-interval-modified', 'w') as f2:
    f2.writelines('chr' + line for line in f1)

【讨论】:

    【解决方案2】:

    第一步打开文件

      file = open("somefile.txt")
    

    第 2 步获取线路

      lines = list(file.readlines())
      file.close()
    

    第 3 步使用列表推导

       new_lines = ["chr"+line for line in lines]
    

    步骤 4 将新行写回文件

       with open("somefile.txt","w") as f:
           f.writelines(new_lines)
    

    为了不在内存中存储所有行

       file1 = open("some.txt")
       file2 = open("output.txt","w")
    
       for line in file1:
           print >> file2, "chr"+ line
    
       file1.close()
       file2.close()
    

    然后只需将output.txt 复制到您的原始文件名

    【讨论】:

    • 这是否需要 Python 一次将所有新行或旧行保存在内存中?我猜它确实需要旧线路。
    • 或者你可以写入一个不同的文件,然后在最后只复制原始文件......但是如果你想写入同一个文件,你需要将所有行读入内存
    • 啊,真的。我错过了你写回同一个文件的事实。
    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多