【问题标题】:iterating over characters in a line and replacing them迭代一行中的字符并替换它们
【发布时间】:2013-07-14 20:32:24
【问题描述】:

我一直在开发一个程序,该程序将用十进制 ascii 等效值替换一行中的字符(hhhhhhhhhhhhhhhhhfhhhhhffffffeee[X]b[d[ed`[Y[^Y,在示例中)并替换结果行。这就是我目前所拥有的......

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 实际上“替换”在第二行中。

【问题讨论】:

  • 你的输入/输出有什么关系?
  • @Jon Clements 我的输入是给定的文本,如果匹配,我的程序将采用 TTGCC... 行,跳过 2 行给出 hhhh... 行并将其附加到列表(unilist)获取每个元素并返回每个字符的 ascii 代码。在这一点上,我只是想知道我可以通过哪种方式将第 2 行和第 4 行配对......只是可能有用的模块等等......谢谢,我希望我很清楚。
  • 不清楚你在问什么或者你想做什么。
  • @msnider 我想遍历模板中第四行的字符,如果该字符的 ascii 十进制分数小于 20,则替换模板中第二行的对应字符由一个'N'。
  • 它将返回修改后的第二行,并带有“N”...线(当扣除33,不好意思忘了说这么多)。

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


【解决方案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's 覆盖第二行中对应的字符。

# 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()

【讨论】:

  • 谢谢,实际上我需要的只是一种引用行内索引的方法,以便更改正确的字符......而且我在数字之间有',' ...所以我正在考虑使用列表...这让我很受用。我会相应地修改我的代码。
  • @Fabien 没问题。要记住的重要一点是 Python 中字符串的不变性。列表很适合这样的问题。此外,使用enumerate() 在循环中跟踪索引是一种有用的策略。
  • 是的,但我想以懒惰的方式来做,一旦操作完成就复制字符串,而不是加入列表......是的,我就是那么懒(而且它永远不会伤害尝试找到解决问题的新方法)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
相关资源
最近更新 更多