私は一日中この問題を解決しようとしてきましたが、成功しませんでした。
「元のファイル」があります。編集したいファイルである「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
私の現在のアプローチは、それぞれの列の行を分割し、既存のタブで行を分割することです。目的は、infile の各行を読み取り、いくつかのものをチェックすることです。
- infile の 3 列目の要素が inlist の 1 列目にある場合は、その要素を inlist の 2 列目のそれぞれの要素に変更します。
- infile の 3 列目の要素が inlist の 2 列目にある場合、何もしない
- infile の 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 そして 2 番目のファイルは hprdmap.txt です: https://www.dropbox.com/s/9hd0e3a8rt95pao/ hprdtotal.txt
お役に立てれば。