在Python中使用列表查找和替换CSV字符串

3
我目前有这个。
import csv

ifile = open('file', 'rb')
reader = csv.reader(ifile,delimiter='\t')
ofile = open('file', 'wb')
writer = csv.writer(ofile, delimiter='\t')


findlist = ['A', 'G', 'C', 'T', 'Y', 'R', 'W', 'S', 'K', 'M', 'X', 'N', '-']
replacelist = ['AA', 'GG', 'CC', 'TT', 'CT', 'AG', 'AT', 'GC', 'TG', 'CA', 
'NN', 'NN', '-']

rep = dict(zip(findlist, replacelist))

def findReplace(find, replace):
    s = ifile.read()
    s = s.replace(find, replace)
    ofile.write(s)

for item in findlist:
    findReplace(item, rep[item])

ifile.close()
ofile.close() 

它所做的是将 A 替换为 AA。然而,我想要的是用 replacelist 中的字母替换所有字母。我对 Python 很陌生,无法弄清楚为什么它没有替换所有内容。
HE670865    399908  N   N   N   N   N
HE670865    399910  N   N   N   N   N
HE670865    399945  T   T   N   T   T
HE670865    399951  R   R   N   A   A
HE670865    399957  A   A   N   A   A
HE670865    399978  C   C   C   M   C
HE670865    399980  C   C   C   C   C
HE670865    399982  T   T   T   T   K
HE670865    399984  C   C   C   C   C


HE670865    399908  N   N   N   N   N
HE670865    399910  N   N   N   N   N
HE670865    399945  T   T   N   T   T
HE670865    399951  R   R   N   AA  AA
HE670865    399957  AA  AA  N   AA  AA
HE670865    399978  C   C   C   M   C
HE670865    399980  C   C   C   C   C
HE670865    399982  T   T   T   T   K
HE670865    399984  C   C   C   C   C
1个回答

6
由于您正在循环内读写,因此出现此问题。
rep = dict(zip(findlist, replacelist))

s = ifile.read()
for item in findlist:
    s = s.replace(item, rep[item])
ofile.write(s)

此外,我认为您的代码如果不使用不必要的dict会更易读(并且更加简洁)。
s = ifile.read()
for item, replacement in zip(findlist, replacelist):
    s = s.replace(item, replacement)
ofile.write(s)

我没有理解代码不工作的原因。是因为函数使用导致局部变量的问题吗? 我曾尝试将ifileofile作为字符串使用,但这是我的代码错误的原因。 - shad0w_wa1k3r
1
由于您为每个替换读取和写入,因此在第一次迭代后,ifile 已经被全部读取到末尾。因此,ifile.read() 在第一次迭代后返回空字符串。 - Paul Draper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接