迭代一行中的字符并替换它们

时间:2013-07-14 20:32:25

标签: python python-3.x replace iteration itertools

我一直在研究一个程序来替换一行中的字符(hhhhhhhhhhhhhhhhfhhhhfffffeee [X] b [d [ed` [Y [^ Y,在本例中]用它们的十进制ascii等价物并替换结果行。这就是我到目前为止......

f2 = path to file
if re.match('[AGNTC]{5}', line):
    next_line = next(f2)
    unilist.append(next(f2))

    for j in unilist:
        j=[x for x in unilist if x]
        g=[word.strip() for word in j]
        g= ''.join(g)

        for ch in g:
            char= ord(ch)
            char= int(char)
            ch= str(char-33)

一切都在这一点上起作用。我不久前开始学习python时只需要指针。我想根据相应字符所在的位置将所有ch放在一个字符串中。 f2文件看起来有点像:

@SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50
TTGCCTGCCTATCATTTTAGTGCCTGTGAGGTGGAGATGTGAGGATCAGT
+SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50
hhhhhhhhhhghhghhhhhfhhhhhfffffeee[X]b[d[ed`[Y[^Y

我在考虑使用itertools进行配对。我还需要修改T,G,C和A的行,这样如果ascii代码小于20,相应的字符将被N替换。正如我前面提到的,我只需要知道什么工具会是最适合这份工作的,所有建议和提示都表示赞赏。

我试过了:

for cha in g:
    g.replace(str(cha), ch)
    print(g)

但是,它会打印出初始行。

修改 我已经用序列解决了我的问题,但我需要知道如何配对值......

   for cha in g:
        char= ord(cha)
        char= int(char)
        ch= str(char-33)
        mylist.append(ch)
mylist=','.join(mylist)
f1.write('%s\n' %mylist)

修改 我试着写一点:

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)
burp = random.randrange(0, 100000000000)

f1 = open(path to file)
f3=open(path to file3, 'w+')

for line, next_line in pairwise(f1):

        if re.match ('[AGTCN]{5}', line):
            for ch in next_line:
                if ch<str('20'):
                    for ch in line:
                        line.replace(ch,'N')
            f3.write('%s' %line)

        else:
            if re.match(r'\d{1,1}', line):
                line=''
                f3.write('%s' %line)

            else:
                f3.write('%s' %line)

但是,我想知道如何在两行中的分数和ch位置之间考虑','。现在输出有第二行,没有修改或任何东西......

修改 现在,我只需要找到一种方法,根据我最新编辑获得的ascii分数,在第二行中实际“替换”N.

1 个答案:

答案 0 :(得分:1)

我相信你要做的是迭代文件中的第二行和第四行,并根据第四行中字符的ASCII值更改第二行中的字符。

输入:

@SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50
TTGCCTGCCTATCATTTTAGTGCCTGTGAGGTGGAGATGTGAGGATCAGT
+SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50
hhhhhhhhhhghhghhhhhfhhhhhfffffeee[X]b[d[ed`[Y[^Y

输出:

@SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50
hhhhhhhhhhghhghhhhhfhhhhhfffffeee[X]b[d[ed`[Y[^Y

Python字符串是不可变的(它们不能被修改)。读取整个文件,将相关行转换为列表,检查第四行中哪些字符的ASCII值大于53,然后用N覆盖第二行中的相应字符。

# Read file, convert strings to lists
fin = open("path/to/file")
lines = fin.readlines()
line2, line4 = list(lines[1]), list(lines[3])  

# Make the changes to our lists
for i, c in enumerate(line4):
   if( ord(c) > 53 ):
      line2[i] = 'N'

# Overwrite line 2
lines[1] = ''.join(line2)

# Save back to the file
fin.seek(0)
for line in lines:
   fin.write(line)

fin.close()