我有一个用制表符分隔的文本文件,例如以下示例:
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')
您知道如何解决该问题吗?
答案 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的更多信息。