我一整天都在尝试解决这个问题,但没有成功。
我有一个名为“infile”的“原始文件”,它是我想要编辑的文件。此外,我还有另一个作为“字典”的文件,让我们称其为“inlist”。
以下是“infile”的示例:
我的当前方法是按照各自的列拆分行,通过现有制表符拆分行。目标是读取输入文件的每一行并检查一些内容:
问题在于,似乎if语句没有起到作用,因为输出文件与输入文件相同。我可能做错了什么?
编辑2:
如一些人所请求的那样,这是完整的代码:
第一个要使用的文件是hprdtotal.txt:https://www.dropbox.com/s/hohvlcdqvziewte/hprdmap.txt,第二个是hprdmap.txt:https://www.dropbox.com/s/9hd0e3a8rt95pao/hprdtotal.txt。希望这可以帮到您。
我有一个名为“infile”的“原始文件”,它是我想要编辑的文件。此外,我还有另一个作为“字典”的文件,让我们称其为“inlist”。
以下是“infile”的示例:
PRMT6 10505 Q96LA8 HMGA1 02829 NP_665906
WDR77 14387 NP_077007 SNRPE 00548 NP_003085
NCOA3 03570 NP_858045 RELA 01241 NP_068810
ITCH 07565 Q96J02 DTX1 03991 NP_004407
并且在列表中:
NP_060607 Q96LA8
NP_001244066 Q96J02
NP_077007 Q9BQA1
NP_858045 Q9Y6Q9
我的当前方法是按照各自的列拆分行,通过现有制表符拆分行。目标是读取输入文件的每一行并检查一些内容:
- 如果输入文件的第3列中的元素在inlist的第1列中找到,则将该元素更改为inlist第2列中的相应元素
- 如果输入文件的第3列中的元素在inlist的第2列中找到,则不进行任何操作
- 对于输入文件的第5列也是同样的操作
PRMT6 10505 Q96LA8 HMGA1 02829 Q(...)
WDR77 14387 Q9BQA1 SNRPE 00548 Q(...)
NCOA3 03570 Q9Y6Q9 RELA 01241 Q(...)
ITCH 07565 Q96J02 DTX1 03991 Q(...)
注意:并非所有的代码都以 Q 开头。
我试过使用 while 循环,但没有成功。由于我刚入门编程,还不想在这么早的时候就失去动力,所以我感到很羞愧,并不愿意在此处发表代码。解决这个问题的完美方法是:
for line in inlist #, infile: <--- THIS PART! Reading both files, splitting both files, replacing both files...
inlistcolumns = line.split('\t')
infilecolumns = line.split('\t')
if inlistcolumns[0] in infilecolumns[2]:
outfile.write(str(infilecolumns[0]) + "\t" + str(infilecolumns[1]) + "\t" + str(inlistcolumns[1]) + "\t" + str(infilecolumns[3]) + "\t" + str(infilecolumns[4]) + "\t" + str(infilecolumns[5]) + "\n")
elif inlistcolumns[0] in infilecolumns[5]:
outfile.write(str(infilecolumns[0]) + "\t" + str(infilecolumns[1]) + "\t" + str(infilecolumns[2]) + "\t" + str(infilecolumns[3]) + "\t" + str(infilecolumns[4]) + "\t" + str(inlistcolumns[1]) + "\n")
else:
outfile.write('\t'.join(infilecolumns) + '\n')
希望能得到您的帮助,谢谢!
好的,在 Sephallia 和 Jlengrand 的提示下,我明白了:
for line in infile:
try:
# Read lines in the dictionary
line2 = inlist.readline()
inlistcolumns = line.split('\t')
infilecolumns = line.split('\t')
if inlistcolumns[0] in infilecolumns[2]:
outfile.write(str(infilecolumns[0]) + "\t" + str(infilecolumns[1]) + "\t" + str(inlistcolumns[1]) + "\t" + str(infilecolumns[3]) + "\t" + str(infilecolumns[4]) + "\t" + str(infilecolumns[5]))
elif inlistcolumns[0] in infilecolumns[5]:
outfile.write(str(infilecolumns[0]) + "\t" + str(infilecolumns[1]) + "\t" + str(infilecolumns[2]) + "\t" + str(infilecolumns[3]) + "\t" + str(infilecolumns[4]) + "\t" + str(inlistcolumns[1]))
else:
outfile.write('\t'.join(infilecolumns))
except IndexError:
print "End of dictionary reached. Restarting from top."
问题在于,似乎if语句没有起到作用,因为输出文件与输入文件相同。我可能做错了什么?
编辑2:
如一些人所请求的那样,这是完整的代码:
import os
def replace(infilename, linename, outfilename):
# Open original file and output file
infile = open(infilename, 'rt')
inlist = open(linename, 'rt')
outfile = open(outfilename, 'wt')
# Read lines and find those to be replaced
for line in infile:
infilecolumns = line.split('\t')
line2 = inlist.readline()
inlistcolumns = line2.split('\t')
if inlistcolumns[0] in infilecolumns[2]:
outfile.write(str(infilecolumns[0]) + "\t" + str(infilecolumns[1]) + "\t" + str(inlistcolumns[1]) + "\t" + str(infilecolumns[3]) + "\t" + str(infilecolumns[4]) + "\t" + str(infilecolumns[5]))
elif inlistcolumns[0] in infilecolumns[5]:
outfile.write(str(infilecolumns[0]) + "\t" + str(infilecolumns[1]) + "\t" + str(infilecolumns[2]) + "\t" + str(infilecolumns[3]) + "\t" + str(infilecolumns[4]) + "\t" + str(inlistcolumns[1]))
outfile.write('\t'.join(infilecolumns))
# Close files
infile.close()
inlist.close()
outfile.close()
if __name__ == '__main__':
wdir = os.getcwd()
outdir = os.path.join(wdir, 'results.txt')
outname = os.path.basename(outdir)
original = raw_input("Type the name of the file to be parsed\n")
inputlist = raw_input("Type the name of the libary to be used\n")
linesdir = os.path.join(wdir, inputlist)
linesname = os.path.basename(linesdir)
indir = os.path.join(wdir, original)
inname = os.path.basename(indir)
replace(indir, linesdir, outdir)
print "Successfully applied changes.\nOriginal: %s\nLibrary: %s\nOutput:%s" % (inname, linesname, outname)
第一个要使用的文件是hprdtotal.txt:https://www.dropbox.com/s/hohvlcdqvziewte/hprdmap.txt,第二个是hprdmap.txt:https://www.dropbox.com/s/9hd0e3a8rt95pao/hprdtotal.txt。希望这可以帮到您。
for line1 in inlist
循环,然后有一个单独的变量,比如line2
,每次循环时从infile
中获取下一行呢? - Sephallia