我有一个以制表符分隔的文件,其值如下:
12 6814296 2 192 C:0.911458 T:0.0885417
12 6814328 2 192 C:1 T:0
12 6814345 2 192 C:1 T:0
12 6814360 2 192 C:1 T:0
12 6814381 2 192 G:1 A:0
12 6814396 2 192 C:1 A:0
12 6814397 2 192 G:0.989583 A:0.0104167
12 6814464 2 192 T:1 C:0
12 6814468 2 192 C:0.927083 TCCC:0.0729167
12 6814486 2 192 C:1 T:0
12 6814551 2 192 G:1 C:0
12 6814567 2 192 A:1 G:0
12 6814589 2 192 C:0.989583 T:0.0104167
12 6814619 2 192 G:1 A:0
12 6814663 2 192 A:1 G:0
12 6814732 2 192 C:1 T:0
12 6814752 4 192 CTTT:0.979167 CTTTTT:0 CT:0.015625 C:0.00520833
12 6814786 2 192 C:1 <CN0>:0
12 6814798 2 192 C:0.984375 T:0.015625
12 6814828 2 192 C:0.989583 G:0.0104167
12 6814951 2 192 G:1 C:0
在这个文件中,我必须创建一个csv文件,其中每行有3个逗号分隔值。
下面是我的代码:
file1 = open('/home/aahm/Documents/gene1.frq', 'r')
input_data = file1.readlines()
for line in input_data:
rm_newline = line.strip('\n')
comma_separated = rm_newline.split('\t')
a = comma_separated[0]
b = comma_separated[1]
c = comma_separated[-1]
d = c[2:]
if comma_separated [2] == '2':
e = a + ','+ b +',' + d
print (e)
elif comma_separated [2] == '3':
f = comma_separated[-1]
g = f[2:]
h = comma_separated[-2]
i = h[2:]
if g > i:
j = a + ','+ b +',' + g
print (j)
else:
k = a + ','+ b +',' + i
print (k)
elif comma_separated [2] == '4':
l = comma_separated[-1]
m = l[2:]
n = comma_separated[-2]
o = n[2:]
p = comma_separated[-3]
q = p[2:]
if m > o and m > p:
r = a + ','+ b +',' + m
print (r)
elif o > m and o > p:
s = a + ','+ b +',' + o
print (s)
elif p > m and p > o:
t = a + ','+ b +',' + p
print (t)
代码运行得很好,除了我使用了以下索引:
d = c[2:]
g = f[2:]
i = h[2:]
等。
对于输入文件中的第6列、第7列和第8列,我只需要输出数字。但是,当':‘前面的字符串大于1时,我的索引会给出字符串和某些行的数字。
最后一列中的值是TCCC:0.0729167,对应一行。当索引'd = c2:‘用于索引时,我得到CC: 0.0729167作为输出,而我只需要0.0729167作为输出。
我被这个问题困住了,完全没有任何关于如何继续的提示。如果有任何帮助,我将非常感激。谢谢!
发布于 2021-02-25 09:12:48
您将列表从第三个字符(包含)切分到末尾,这将在您的示例中显示“CC:0.0729167”。正如其他人在评论中所说,您可以只使用yourstring.split(":")[1]
来根据冒号的位置拆分字符串,然后通过使用[1]
指定其索引来检索字符串的后半部分。
发布于 2021-02-25 09:58:12
根据其他人的评论,如果您在列数据中保留了一个":“,则需要将其拆分。然而,这里的代码已经相当不透明了--所有的字母变量使得我们很难看到一段简单的代码到底想要做什么。为了避免更糟糕的情况,在下面的示例中,我定义了一个简单的函数getnum,您可以向它提供一个字段,如果需要,它将为您执行拆分。当然,如果字段有多个":“字符,这将不起作用,但修改getnum将非常容易。然后,我修改了代码,通过这个getnum函数运行每个字段。
为了让自己的生活更轻松,我鼓励您使用比a、b、c等更有意义的变量名。此外,这里和那里的一些解释注释将会有很大的帮助-我认为有了这些,你可能已经能够自己解决这个问题了!
input_data = file1.readlines()
# process a field to only use numbers after a :
def getnum(src):
if ":" in src:
return src.split(":")[1]
else:
return src
for line in input_data:
rm_newline = line.strip('\n')
comma_separated = rm_newline.split('\t')
a = getnum(comma_separated[0])
b = getnum(comma_separated[1])
c = getnum(comma_separated[-1])
d = c[2:]
if comma_separated [2] == '2':
e = a + ','+ b +',' + d
print (e)
elif comma_separated [2] == '3':
f = getnum(comma_separated[-1])
g = f[2:]
h = getnum(comma_separated[-2])
i = h[2:]
if g > i:
j = a + ','+ b +',' + g
print (j)
else:
k = a + ','+ b +',' + i
print (k)
elif comma_separated [2] == '4':
l = getnum(comma_separated[-1])
m = l[2:]
n = getnum(comma_separated[-2])
o = n[2:]
p = getnum(comma_separated[-3])
q = p[2:]
if m > o and m > p:
r = a + ','+ b +',' + m
print (r)
elif o > m and o > p:
s = a + ','+ b +',' + o
print (s)
elif p > m and p > o:
t = a + ','+ b +',' + p
print (t)
https://stackoverflow.com/questions/66365419
复制相似问题