Pythonで改行のないファイルを読む

Pythonでは

temp = open(filename,'r').readlines()

を呼び出すと、各要素がファイルの1行であるリストになります。少し馬鹿げていますが、それでも readlines() は各要素に改行文字を書き込みますが、これは起きてほしくありません。

どうしたらそれを避けることができるでしょうか?

ソリューション

ファイル全体を読み込んで、str.splitlines`で行を分割することができます。

temp = file.read().splitlines()

あるいは、手で改行を除去することもできます。

temp = [line[:-1] for line in file]

注意:この最後の方法は、ファイルが改行で終わっている場合にのみ有効で、そうでない場合は最終行の文字が失われます。

この仮定はほとんどの場合に当てはまります(特にテキストエディタで作成されたファイルでは、最後に改行が追加されることがよくあります)。

これを避けたい場合は、ファイルの最後に改行を追加します。

with open(the_file, 'r+') as f:
    f.seek(-1, 2)  # go at the end of the file
    if f.read(1) != '\n':
        # add missing newline if not already present
        f.write('\n')
        f.flush()
        f.seek(0)
    lines = [line[:-1] for line in f]

あるいは、もっと簡単な方法として、改行を strip することもできます。

[line.rstrip('\n') for line in file]

あるいは、かなり読めないが

[line[:-(line[-1] == '\n') or len(line)+1] for line in file]

これは or の戻り値が真偽ではなく、真偽が評価されたオブジェクトであることを利用したものです。


readlines`メソッドは、実際には以下のものと同等です。

def readlines(self):
    lines = []
    for line in iter(self.readline, ''):
        lines.append(line)
    return lines

# or equivalently

def readlines(self):
    lines = []
    while True:
        line = self.readline()
        if not line:
            break
        lines.append(line)
    return lines

readline()が改行を保持しているので、readlines()も改行を保持しています。

Note: readlines()と対称的に、writelines()メソッドは末尾の改行を追加しないので、f2.writelines(f.readlines())f2fの正確なコピーを生成します。

解説 (7)
temp = open(filename,'r').read().split('\n')
解説 (10)
def getText():
    file=open("ex1.txt","r");

    names=file.read().split("\n");
    for x,word in enumerate(names):
        if(len(word)>=20):
            return 0;
            print "length of ",word,"is over 20"
            break;
        if(x==20):
            return 0;
            break;
    else:
        return names;

def show(names):
    for word in names:
        len_set=len(set(word))
        print word," ",len_set

for i in range(1):

    names=getText();
    if(names!=0):
        show(names);
    else:
        break;
解説 (0)