よろしくお願いします。
私はPythonが初めてで、ファイルをある形式から別の形式に変換しようとしています。
ここに私が持っているコードがあります:
fs = open('sample_data.txt','r')
fnew = open('sample_output.txt','w')
with fs as f:
while True:
line = f.readline()
if line and line[0]=='#':
print(line)
fnew.write(line + '\n')
else:
data=line.split()
fnew.write(data[0])
if not line: break
print('end of program')
fs.close
fnew.close
ファイルの基本的な形式には、先頭にコメント付きのヘッダーがあり、その後にデータ行が続きます。
私が抱えている問題は、 fnew.write(data[0]) 行にあります。次のエラーが表示されます。
IndexError: リスト インデックスが範囲外です
行の分割により、8 つの列のデータが分割されます。そのうちの最初の 2 つを削除します。したがって、最終的には、ファイル全体から最初の 2 列を除いて書き直す必要があります。もっと複雑な再フォーマットを行う必要がありますが、このステップのエラーを理解できれば、残りの方法を理解できるかもしれません。
- - - - - - - アップデート
abarnet さん、その通りです。エラーの原因は改行です。ただし、あなたが言ったように、チェックを追加しようとすると別の問題が発生します。以下のコードを実行すると、すべてがフリーズします。「if data:」チェックを削除すると実行されますが、同じ「index out of range」エラーが表示されます。
また、「if data:」チェックを削除し、改行を含まないサンプルデータファイルを使用して、以下のように実行しようとしましたが、フリーズしました。
これを引き起こしている可能性のあるものについて誰かが光を当てることができますか?
fs = open('sample_data.txt','r')
fnew = open('sample_output.txt','w')
with fs as f:
while True:
line = f.readline()
for line in f:
if line[0]=='#':
print(line)
fnew.write(line + '\n')
else:
data=line.split()
if data:
print(data[0])
fnew.write(data[0] + '\n')
print('end of program')
fs.close
fnew.close
-------------- 更新 2
以下のこのコードは機能します。無限ループの問題を明らかにしてくれた abarnet に感謝します。私が抱えている最後の問題は、改行であろうとヘッダー行であろうと、データの最初の行が無視され、出力に出力されないことです。
with open('sample_data.txt','r') as f, open('sample_output.txt','w') as fnew:
line = f.readline()
for line in f:
if line[0]=='#':
print(line)
fnew.write(line + '\n')
else:
data=line.split()
if data:
print(data[0])
fnew.write(data[0] + '\n')
print('end of program')
fnew.close()