更改文本文件并在python中制作更大的文本文件

时间:2018-11-25 09:05:21

标签: python

我有一个用制表符分隔的文本文件,例如以下示例:

infile

chr1    +   1071396 1271396 LOC
chr12   +   1101483 1121483 MIR200B

我想将infile中第3列和第4列之间的差异除以100,并在infile中使每行100行,并创建一个名为newfile的新文件 并用6列制作最后一个制表符分隔的文件。前5列类似于infile,第6列是(第5列)_part number(number是1到100)。

这是预期的输出文件:

expected output

chr1    +   1071396 1073396 LOC LOC_part1
chr1    +   1073396 1075396 LOC LOC_part2
.
.
.
chr1    +   1269396 1271396 LOC LOC_part100
chr12   +   1101483 1101683 MIR200B MIR200B_part1
chr12   +   1101683 1101883 MIR200B MIR200B_part2
.
.
.
chr12   +   1121283 1121483 MIR200B MIR200B_part100

我编写了以下代码来获得预期的输出,但未返回预期的结果。

file = open('infile.txt', 'rb')
cont = []
for line in file:
    cont.append(line)


newfile = []
for i in cont:
    percent = (i[3]-i[2])/100
    for j in percent:
        newfile.append(i[0], i[1], i[2], i[2]+percent, i[4], i[4]_'part'percent[j])


with open('output.txt', 'w') as f:
    for i in newfile:
        for j in i:
            f.write(i + '\n')

您知道如何解决该问题吗?

3 个答案:

答案 0 :(得分:2)

尝试一下:

file = open('infile.txt', 'rb')
cont = []
for line in file:
    cont.append(list(filter(lambda x: not x.isspace(), line.split(' ')))


newfile = []
for i in cont:
    diff= (int(i[3])-int(i[2]))/100 
    left = i[2] 
    right = i[2] + diff
    for j in range(100):
        newfile.append(i[0], i[1], left, right, i[4], i[4]_'part' + j)
        left = right
        right = right + diff



with open('output.txt', 'w') as f:
    for i in newfile:
        for j in i:
            f.write(i + '\n')

在您的代码for i in cont中,您遍历字符串,而我是一个字符而不是字符串。

为了解决这一问题,我将分界线并删除空格。

答案 1 :(得分:0)

以下是一些建议:

打开文件时,将其作为文本文件而不是二进制文件打开。

open('infile.txt','r')

现在,当您逐行阅读时,应使用strip()在末尾删除换行符。然后,您需要使用split('\ t'),通过制表符将输入文本行拆分为字符串列表,而不是包含行的长字符串:

line.strip().split('\t')

现在您拥有:

file = open('infile.txt', 'r')
cont = []
for line in file:
    cont.append(line.strip().split('\t))

现在cont是一个列表列表,其中每个列表都包含制表符分隔的数据。即

cont[1][0] = 'chr12'. 

您可能可以从这里拿走它。

答案 2 :(得分:0)

其他人已经回答了关于您自己的代码的问题,我想我会尽力在这里解决您的问题。

import os
directory = "C:/Users/DELL/Desktop/"
filename = "infile.txt"
path = os.path.join(directory, filename)

with open(path, "r") as f_in, open(directory+"outfile.txt", "w") as f_out: #open input and output files
    for line in f_in:
        contents = line.rstrip().split("\t") #split line into words stored as a string 'contents'
        diff = (int(contents[3]) - int(contents[2]))/100
        for i in range(100):
            temp = (f"{contents[0]}\t+\t{int(int(contents[2])+ diff*i)}\t{contents[3]}\t{contents[4]}\t{contents[4]}_part{i+1}")
            f_out.write(temp+"\n")

此代码不能很好地遵循python样式约定(例如,过长的行),但是可以正常工作。 temp = ...行使用fstrings方便地格式化输出字符串,您可以阅读有关here的更多信息。