改行なしでファイルを読み取る方法は?


374

Pythonでは、

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

結果として、各要素がファイルの行であるリストが作成されます。それは少しばかげていreadlines()ますが、それでも、各要素に改行文字を書き込みます。

どうすれば回避できますか?


4
ストリップを使用します[l.strip('\n\r') for l in temp]。またはrstrip。そして、ここでの反復なので、のin open代わりにすることができますin temp
gorlum0 2012

11
Python 3で、openのnewline引数をその途切れた末尾の改行に設定する値があればいいのですが。
jxramos

回答:


554

あなたはファイル全体を読み、行を分割することができます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ブール値ではなく、trueまたはfalseと評価されたオブジェクトであるという事実を利用しています。


この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()保持します。

注:への対称性のために方法がないではない改行を終了追加し、これの正確なコピー生成では。readlines()writelines()f2.writelines(f.readlines())ff2


1
[line.rstrip('\n') for line in file]は複数の末尾を削除することに注意してください\n
Wes Turner、

1
もっと簡単に言えば、[line[:-(line[-1] == '\n') or len(line)+1] for line in file]代わりに[line[:-(line[-1] == '\n') or None] for line in file]
Wes Turner

10
これらのソリューションは、ファイル全体をメモリに読み込みます。括弧にリスト内包の角括弧を変更すると、一度にファイル1行上であなたに反復処理をすることができますジェネレータ式を行います for line in (x.strip() for x in f):
ジョセフ・シーディ

2
@velotronそれは実際には質問/回答のポイントではありません。またwith、ブロックが終了するとファイルを閉じることに注意してください。これは、I / Oエラーが発生するため、外部で実行with open(...) as f: lines = (line for line in f)して使用することができないことを意味します。genexpを使用して遅延することもできますが、ファイルを閉じる前にそれを使用する必要があります。lineswith
バクリウ2017年

@WesTurner。ただし、末尾の改行は1つしかありません。余分な改行は次の空行の一部になります
Mad Physicist

38
temp = open(filename,'r').read().split('\n')

14
\r\n改行はどうなりますか?;)
Wolph

26
Pythonは自動的にユニバーサル改行を処理するため.split('\n')、改行の規則に関係なく、正しく分割されます。バイナリモードでファイルを読み取る場合は問題になります。その場合splitlines()、ユニバーサル改行split('\n')は処理されますが、処理されません。
Bakuriu

7
そして常にありますos.linesep:)
askewchan

1
@LarsH、それはいくつかの状況で役立ちます。私のシステムの\r\n行末では、テキストとして読み取られるかバイナリとして読み取られるかにかかわらず、に変換されない\nためos.linesep\n機能しない場合に機能します。しかしsplitlines、ファイルがosと一致しない場所について言及する場合は、明らかに良い選択です。この議論を見ている人々がその存在に気づいていない場合に備えて、私は本当にほとんどそれを述べました。
askewchan 2016

1
@askewchan古いバージョンのPythonを使用している可能性があります。Python 3では、ユニバーサル改行はデフォルトで有効になっています。つまり\r\n、Linuxで実行している場合でも、テキストファイル用に変換されます。
Arthur Tacca 2017年

13

もう一つの例:

一度に1行ずつファイルを読み取る。文字列の最後から不要な文字を削除するstr.rstrip(chars)

with open(filename, 'r') as fileobj:
    for row in fileobj:
        print( row.rstrip('\n') )

も参照 str.strip([chars])してstr.lstrip([chars])

(python> = 2.0)


10
temp = open(filename,'r').read().splitlines()

5
これでファイルが閉じますか?そうではないので、実際には1行ではありません...
Ray Hulha

9

これが最良の選択だと思います。

temp = [line.strip() for line in file.readlines()]

8
このソリューションでは、意図しない先頭と末尾のスペースも削除されます。
Roland Illig

しかし、理解力は本当に素晴らしいです。少なくともPython 3では、temp = [line.rstrip() for line in file.readlines()]@ Roland_Illigのメモが意図するものを取得するために使用できます。
bballdave025

すべての行を繰り返し処理する場合は、なぜそんなに怠惰にしないのですか?を使用すると.readlines()、ファイル全体を効果的に2回繰り返すことができます。
AMC

1

これを試して:

u=open("url.txt","r")  
url=u.read().replace('\n','')  
print(url)  

4
このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の質を高めるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。また、コードと説明の両方が読みにくくなるため、コードを説明コメントで混雑させないようにしてください。
さようならStackExchange 2018

なぜ代替ソリューションのいくつかでこれを使用する必要があるのか​​わかりません。
AMC

-1
my_file = open("first_file.txt", "r")
for line in my_file.readlines():
    if line[-1:] == "\n":
        print(line[:-1])
    else:
        print(line)
my_file.close() 

3
他の人に役立つように説明を追加してください。
samuellawrentz 2018

コンテキストマネージャを使用してファイルオブジェクトを処理し、ファイルを直接反復処理する必要があります。この.readlines()ように使用することで、ファイル全体を効果的に2回繰り返すことができます。
AMC

-2
import csv

with open(filename) as f:
    csvreader = csv.reader(f)
    for line in csvreader:
         print(line[0])

2
しかし、行にコンマが含まれている場合はどうなりますか?
ギルチ

-8
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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.