2016-06-17 5 views
1

ファイルから(最初の)行を読み込んでリストに追加するときに、私のpythonプログラムが何をするのかを理解できない問題があります。なんらかの理由で、最初の行は空でなければなりません。あるいは、最初の行を正しく読み取らないでしょう。最初の行が空であれば、空ではありません(少なくともPythonによるとは限りません)。 事は、私は、ファイルの2種類持って、次のとおりです。Python - テキストファイルの最初の行をリストに正しく読み込めません

まずファイルを形式である:

text:more text 
another text:and more 

と形態の第2のファイル:

text_file.txt 
anothertext_file.txt 

両方のファイルがUTF-あります8つのエンコードされたテキストファイル。私のプログラムにリストに追加されます両方のファイルの最初の行は、「テキスト」と「text_file.txt」が、たとえば言うしようとする任意のコードである

でも「場合

が実行され得ることはありません

if something == "text": 
    ... 
何か " は"テキスト "と同じです。

私は自分の問題がマシンコード(または何か)のどこかにあると仮定しています。私のコンピュータはテキストファイルの先頭にいくつかの目に見えないコードを書きます。多分?私は実際には、単に空行とANを追加することによって、問題の解決策を発見した行毎にファイルを読み込む句の場合:

if not "." in line: 
    ... 

やその他のファイルタイプで

if not ":" in line: 
    ... 

ものであれば句仕事と私のプログラムは、(私はいつもファイルの先頭に空の行を追加する限り)それが想定していることをしますが、私のプログラムがそのまま動作している理由の本当の理由を見つけることができませんでした。また、すべてのファイルを編集したり、if節を自分のコードに追加したりすることが不要な、より簡単な解決策があれば、このような回避策を講じる必要はありません。

ここで何が起こっているのか理解していただければ幸いです。

編集:あなたのように人々が私のコードを求めてきたが、ここにある:

filelist = [] 
with open("filename.txt", "r", encoding="UTF-8") as f: 
for line in f: 
    filelist.append(line.rstrip("\n")) 

これが正常に動作しません。また、mxdsが言ったように試しました。

filelist = [] 
with open("filename.txt", "r", encoding="UTF-8") as f: 
lines = f.readlines() 
for line in lines: 
    filelist.append(line.rstrip("\n")) 

これは動作しません。これは、最初の行の最初の文字のファイルにのみ問題です。

Edit2: 問題は、テキストファイルの先頭にバイトオーダーマークがあるようです。すばやいグーグル・グーグルの後、私はそれをどのように取り除くことができるかという解決策を見いだせなかった。私はメモ帳だけでファイルを作成しています。

最終編集: 明らかにメモ帳は実際のテキストエディタではありません。私はこの問題を避けるためにメモ帳からメモ帳にスワップします。メモ帳でテキストファイルを開いてテキストを追加すると、BOMが追加されますか、それともファイルの作成時にのみ行われるのでしょうか?

+0

ファイルの読み方によっては、各行が改行文字で終わる場合と終わらない場合があります。 –

+1

... BOM(バイトオーダーマーク - シバ)で始まる場合があります。 – Dilettant

+1

これを見る前に、あなたのプログラムがあなたのファイルをどのように読んでいるのかを修正すべきだと言います。これらの2つの問題が結びついている可能性があります。コードを投稿すると、そのコードをお手伝いすることができます。 – kirkpatt

答えて

1

How to make Notepad to save text in UTF-8 without BOM?によれば、あなたは既にこの作業をしているようですが、最高の答えはメモ帳を使用しないことです(しかしメモ帳++は問題ありません)。 :)また

、あなたがstrip the BOM in Pythonとすることができます

line = line.decode("utf-8-sig").encode("utf-8") 

https://docs.python.org/3/library/codecs.htmlを参照してください:

はUTF-8エンコーディングが を検出することができるとともに、信頼性を向上させるために、マイクロソフトは、のバリアントを発明しましたUTF-8(そのPython 2.5は "utf-8-sig"を呼び出します)Unicode 文字のいずれかがファイルに書き込まれる前に、UTF-8でエンコードされたBOM( のようにバイトシーケンス:0xef,0xbb0xbf)が書き込まれます。彼らはファイルの最初の3つのバイトとして表示された場合、デコードutf-8-sig

...

は、これらの3つのバイトをスキップします。 UTF-8では、BOMの使用は推奨されず、一般的には避けるべきです。

+0

ああ、間違いなく私のようなものです使用したいかもしれません!ありがとう! :) – vivas

0

Pythonでテキストファイルを読み込むに古典的なアプローチがある:あなたがこのような行を処理することができた後

with open(fname, 'r') as f: 
    lines = f.readlines() 

for line in lines: 
    # do something with line... 

他のコメントが示唆したように、あなたがしたいことこれが最初に機能することを確認します。レビューのために現在のコードを投稿すると役立ちます。

関連する問題