2017-02-15 10 views
1

インポートされたテキストファイルの各行から最初の45文字を削除し、その結果を新しいテキストファイルに書き込もうとしています。なんらかの理由で、リスト/行の最初の項目だけが乱され、最初の42文字だけが削除されます。リストのループアクションが最初の項目だけ正しく実行されない

私はこの問題を何度も経験したことがありますが、それが起こっていた理由を理解したことはありませんでした。ありがとう!ここで

は私のコードです:

list1 = [] 
list2 = [] 
with codecs.open('FILE.txt', "r", encoding="utf-8") as inputfile: 
     list1 = [line.strip() for line in inputfile] 
     list1 = [x.encode('utf-8') for x in list1] 
     for item in list1: 
      list2.append(item[45:]) 
z = open('NEWFILE.txt', 'w'); 
z.write("\n".join(list2)) 
z.close() 
+0

実際にその行に3つの余分な目に見えない文字があるように聞こえます。 – user2357112

+0

なぜあなたはエンコードした後にスライスしますか?このようにすると、45バイトではなく45バイトが切り詰められます。 – user2357112

+0

BOMヘッダの問題ではありませんか? BOMヘッダーはエンコーディングの一部であり、最初の行の長さは3バイト... –

答えて

1

最初の行に3バイトのシフトとともにUTF-8のものは非常に余分なBOMヘッダのように見えること。

>>> from codecs import BOM_UTF8 
>>> len(BOM_UTF8) 
3 

BOMヘッダーはほとんどのテキストエディタで検出され、(テキストエディタを使用しない限り)直接表示されません。

行(最初の行)がBOMヘッダで始まる場合
for item in list1: 
    list2.append(item[45+len(codecs.BOM_UTF8) if item.startswith(codecs.BOM_UTF8) else 45:]) 

はそう、あなたは3余分なバイト

を追加したり、あなたがコードすることができる前に直接:

は、私はあなたがこのようなあなたの内側のループを変更する提案しますあなたの完全な文字列:

list1 = [(x[len(codecs.BOM_UTF8):] if x.startswith(codecs.BOM_UTF8) else x).encode('utf-8') for x in list1] 

このQ/Aから取られたBOM-ストリップコード:Python load json file with UTF-8 BOM header

+0

最初の返信ですでにご提供したリンクを熟読しましたが、あなたはより深い説明をしています。あなたが提供したループラインは、私の投稿が役に立ったら、完全に – user3597545

+1

で動作し、その答えを受け入れることができます。あなたが自分自身を考え出したら、もちろんそれを受け入れる必要はありません。 –

関連する問題