Lecture d'un fichier sans saut de ligne

En Python, appelant

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

Résultats dans une liste dans laquelle chaque élément est une ligne dans le fichier. C'est un peu stupide mais quand même: readlines() écrit également un caractère de nouvelle ligne à chaque élément, quelque chose que je ne souhaite pas arriver. Comment puis-je l'éviter?

233
demandé sur Ben 2012-09-08 15:55:15

8 réponses

Vous pouvez lire le fichier entier et diviser les lignes en utilisant str.splitlines:

temp = file.read().splitlines()

Ou vous pouvez dépouiller la nouvelle ligne à la main:

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

Note: cette dernière solution ne fonctionne que si le fichier se termine par une nouvelle ligne, sinon la dernière ligne perdra un caractère.

Cette hypothèse est vraie dans la plupart des cas (en particulier pour les fichiers créés par des éditeurs de texte, qui souvent font ajouter une nouvelle ligne de fin de toute façon).

Si vous voulez éviter cela, vous pouvez ajouter une nouvelle ligne à la fin du fichier:

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]

Ou une alternative plus simple est de strip la nouvelle ligne à la place:

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

Ou même, bien que assez illisible:

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

Qui exploite le fait que la valeur de retour de or n'est pas un booléen, mais l'objet évalué true ou false.


La méthode readlines est en fait équivalente à:

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

Puisque readline() garde la nouvelle ligne aussi readlines() La Garde.

Remarque: pour la symétrie de readlines() le writelines() la méthode n'ajoute pas de fin de ligne, donc f2.writelines(f.readlines()) produit une copie exacte de f dans f2.

336
répondu Bakuriu 2017-01-23 19:16:05
temp = open(filename,'r').read().split('\n')
23
répondu vivek 2012-09-08 11:57:56
temp = open(filename,'r').read().splitlines()
6
répondu Marcel Jacques Machado 2017-08-17 02:01:22
import csv

with open(filename) as f:
    csvreader = csv.reader(f)
    for line in csvreader:
         print(line[0])
1
répondu srus 2016-10-04 12:33:17

Essayez ceci:

u=open("url.txt","r")  
url=u.read().replace('\n','')  
print(url)  
1
répondu Nitesh Soni 2018-02-05 06:12:56
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() 
0
répondu Necriss 2018-08-12 14:39:12

Un autre exemple:

Lecture du fichier une ligne à la fois. Supprimer les caractères à partir de la fin de la chaîne str.rstrip(chars)

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

Voir aussi str.bande([caractères]) et str.lstrip([caractères])

(python > = 2.0)

0
répondu O95 2018-09-28 15:14:07
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;
-5
répondu user4730171 2015-04-01 01:07:46