私は最近、Pythonとそれを自分の仕事に適用する方法を学んでいます。いくつかのスクリプトを正常に作成しましたが、理解できない問題が発生しています。
1行に2つのタブ区切りの列がある、最大4000行のファイルを開いています。入力ファイルを読み取ると、リストインデックスが範囲外であるというインデックスエラーが発生します。ただし、毎回エラーが発生しますが、毎回同じ行で発生するわけではありません(のように、毎回異なる行でエラーがスローされます!)。したがって、何らかの理由で、それは一般的には機能しますが、その後(一見)ランダムに失敗します。
私は文字通り先週Pythonを学び始めたばかりなので、困惑しています。同じ問題を探しましたが、似たようなものは見つかりませんでした。さらに、これが言語固有の問題なのか、IPython固有の問題なのかわかりません。どんな助けでも大歓迎です!
input = open("count.txt", "r")
changelist = []
listtosort = []
second = str()
output = open("output.txt", "w")
for each in input:
splits = each.split("\t")
changelist = list(splits[0])
second = int(splits[1])
print second
if changelist[7] == ";":
changelist.insert(6, "000")
va = "".join(changelist)
var = va + ("\t") + str(second)
listtosort.append(var)
output.write(var)
elif changelist[8] == ";":
changelist.insert(6, "00")
va = "".join(changelist)
var = va + ("\t") + str(second)
listtosort.append(var)
output.write(var)
elif changelist[9] == ";":
changelist.insert(6, "0")
va = "".join(changelist)
var = va + ("\t") + str(second)
listtosort.append(var)
output.write(var)
else:
#output.write(str("".join(changelist)))
va = "".join(changelist)
var = va + ("\t") + str(second)
listtosort.append(var)
output.write(var)
output.close()
エラー
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
/home/a/Desktop/sharedfolder/ipytest/individ.ins.count.test/<ipython-input-87-32f9b0a1951b> in <module>()
57 splits = each.split("\t")
58 changelist = list(splits[0])
---> 59 second = int(splits[1])
60
61 print second
IndexError: list index out of range
入力:
ID=cds0;Name=NP_414542.1;Parent=gene0;Dbxref=ASAP:ABE-0000006,UniProtKB%2FSwiss-Prot:P0AD86,Genbank:NP_414542.1,EcoGene:EG11277,GeneID:944742;gbkey=CDS;product=thr 12
ID=cds1000;Name=NP_415538.1;Parent=gene1035;Dbxref=ASAP:ABE-0003451,UniProtKB%2FSwiss-Prot:P31545,Genbank:NP_415538.1,EcoGene:EG11735,GeneID:946500;gbkey=CDS;product=deferrrochelatase%2C 50
ID=cds1001;Name=NP_415539.1;Parent=gene1036;Note=PhoB-dependent%2C 36
必要な出力:
ID=cds0000;Name=NP_414542.1;Parent=gene0;Dbxref=ASAP:ABE-0000006,UniProtKB%2FSwiss-Prot:P0AD86,Genbank:NP_414542.1,EcoGene:EG11277,GeneID:944742;gbkey=CDS;product=thr 12
ID=cds1000;Name=NP_415538.1;Parent=gene1035;Dbxref=ASAP:ABE-0003451,UniProtKB%2FSwiss-Prot:P31545,Genbank:NP_415538.1,EcoGene:EG11735,GeneID:946500;gbkey=CDS;product=deferrrochelatase%2C 50
ID=cds1001;Name=NP_415539.1;Parent=gene1036;Note=PhoB-dependent%2C 36
を取得する理由IndexError
は、入力ファイルが完全にタブ区切りではないように見えるためです。そのためsplits[1]
、アクセスしようとしても何もありません。
コードでリファクタリングを使用できます。まず、if
-checksを繰り返しますが、これは不要です。これcds0
は7文字にパディングするだけで、おそらくあなたが望むものではありません。コードをリファクタリングしてもう少しPythonicでドライにする方法を示すために、以下をまとめました。それがあなたのデータセットで機能することを保証することはできませんが、それがあなたが物事を違ったやり方で行う方法を理解するのに役立つことを願っています。
to_sort = []
# We can open two files using the with statement. This will also handle
# closing the files for us, when we exit the block.
with open("count.txt", "r") as inp, open("output.txt", "w") as out:
for each in inp:
# Split at ';'... So you won't have to worry about whether or not
# the file is tab delimited
changed = each.split(";")
# Get the value you want. This is called unpacking.
# The value before '=' will always be 'ID', so we don't really care about it.
# _ is generally used as a variable name when the value is discarded.
_, value = changed[0].split("=")
# 0-pad the desired value to 7 characters. Python string formatting
# makes this very easy. This will replace the current value in the list.
changed[0] = "ID={:0<7}".format(value)
# Join the changed-list with the original separator and
# and append it to the sort list.
to_sort.append(";".join(changed))
# Write the results to the file all at once. Your test data already
# provided the newlines, you can just write it out as it is.
output.writelines(to_sort)
# Do what else you need to do. Maybe to_list.sort()?
このコードはコードを8行に減らしますが、まったく同じことを実現し、繰り返されず、非常に理解しやすいことに気付くでしょう。
PythonのZenであるPEP8を読んで、公式チュートリアルを実行してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加