gpt4 book ai didi

python - 对行和下一行执行某些操作,直到击中符号为止

转载 作者:行者123 更新时间:2023-11-30 23:12:26 35 4
gpt4 key购买 nike

我有数据,设置如下:

//Name_1   *   *
>a xyzxyzyxyzyxzzxy
>b xyxyxyzxyyxzyxyz
>c xyzyxzyxyzyxyzxy
//Name_2
>a xyzxyzyxyzxzyxyx
>b zxyzxyzxyyzxyxzx
>c zxyzxyzxyxyzyzxy
//Name_3 * *
>a xyzxyzyxyzxzyxyz
>b zxyzxyzxzyyzyxyx
>c zxyzxyzxyxyzyzxy
...

//行指的是以下序列组的 ID,直到到达下一个//行。我一直在编写一个程序,该程序读取星号的位置,并在序列的给定位置上打印字符。为了为自己简化事情,我一直在研究数据的子集,仅包含一组序列,因此例如:

//Name_1   *   *
>a xyzxyzyxyzyxzzxy
>b xyxyxyzxyyxzyxyz
>c xyzyxzyxyzyxyzxy

我的程序在这个子集上执行我想要的操作。

import sys
import csv

datafile = open(sys.argv[1], 'r')

outfile = open(sys.argv[1]+"_FGT_Data", 'w')
csv_out = csv.writer(outfile, delimiter=',')

csv_out.writerow(['Locus', 'Individual', 'Nucleotide', 'Position'])

with (datafile) as searchfile:
var_line = [line for line in searchfile if '*' in line]
LocusID = [line[2:13].strip() for line in var_line]
poslist = [i for line in var_line for i, x in enumerate(line) if x =='*']

datafile = open(sys.argv[1], 'r')


with (datafile) as getsnps:
lines = [line for line in getsnps.readlines() if line.startswith('>')]
for pos in poslist:
for line in lines:
snp = line[pos]

individual = line[0:7]
indistr = individual.strip()
csv_out.writerow((LocusID[0], indistr, line[pos], str(pos)))


datafile.close()
outfile.close()

但是,现在我正在尝试修改它以处理完整的数据集。我无法找到一种以正确方式迭代数据的方法。我需要搜索文件,当到达包含 '' 的行时,我需要按照上面的代码执行与给定行对应的序列,然后继续到包含 '< 的下一行/em>'。我是否需要根据//行分割数据,或者什么是最好的方法?

我已将数据样本上传到保管箱:Data_Sample.txt 包含几个组,并且是我试图让程序运行的数据类型。Data_One_Group.txt 仅包含一组,并且是我迄今为止让程序处理的数据。

https://www.dropbox.com/sh/3j4i04s2rg6b63h/AADkWG3OcsutTiSsyTl8L2Vda?dl=0

--------编辑---------

我正在尝试实现下面@Julien Spronck 的建议。但是,我在处理生成的 block 时遇到问题。我如何能够在 block 行中搜索行。例如,为什么以下内容不能按预期工作?它只打印星号'而不是行本身。

block =''
with open('onelocus.txt', 'r') as searchfile:
for line in searchfile:
if line.startswith('//'):
#print line
if block:
for line in block:
if '*' in line:
print line

block = line
else:
block += line

---------编辑2----------

我越来越近了。我明白这一事实,我需要将字符串分成几行,以便能够搜索它们。下面的代码适用于一个组,但是当我尝试迭代多个组时,它仅打印第一组的信息。但它是为尽可能多的群体而做的。我尝试在下一次迭代之前清除 LocusID 和 poslist,但这似乎不是解决方案。

block =''
with (datafile) as searchfile:
for line in searchfile:
if line.startswith('//'):
if block:
var_line = [line for line in block.splitlines() if '*' in line]
LocusID = [line[2:13].strip() for line in var_line]
print LocusID
poslist = [i for line in var_line for i, x in enumerate(line) if x == '*']
print poslist



block = line
else:
block += line

最佳答案

你不能做这样的事情吗:

block =''
with open(filename, 'r') as fil:
for line in fil:
if line.startswith('//'):
if block:
do_something_with(block)
block = line
else:
block += line
if block:
do_something_with(block)

在此代码中,我只是将文件行附加到变量 block 。一旦找到以 // 开头的行,我就会处理前一个 block 并为下一次迭代重新初始化该 block 。

最后两行将负责处理最后一个 block ,否则不会对其进行处理。

do_something_with(block) 可能是这样的:

def do_something_with(block):

lines = block.splitlines()

j = 0
first_line = lines[j]
while first_line.strip() == '':
j += 1
first_line = lines[j]

pos = []
position = first_line.find('*')
while position != -1:
pos.append(position)
position = first_line.find('*', position+1)

for k, line in enumerate(lines):
if k > j:
for p in pos:
print line[p],
print

## prints
## z y
## x z
## z y

关于python - 对行和下一行执行某些操作,直到击中符号为止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29819325/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com