branje datoteke brez novih vrstic v Pythonu

V Pythonu je klicanje

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

dobimo seznam, v katerem je vsak element vrstica v datoteki. Malce neumno, a vendar: readlines() vsakemu elementu zapiše tudi znak nove vrstice, česar ne želim, da bi se zgodilo.

Kako se lahko temu izognem?

Rešitev

Celotno datoteko lahko preberete in razdelite vrstice z uporabo str.splitlines:

temp = file.read().splitlines()

Lahko pa tudi ročno odstranite nove vrstice:

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

Note: ta zadnja rešitev deluje le, če se datoteka konča z novo vrstico, sicer bo zadnja vrstica izgubila znak.

Ta predpostavka velja v večini primerov (zlasti za datoteke, ustvarjene z urejevalniki besedil, ki pogosto zelo dodajo končno novo vrstico).

Če se želite temu izogniti, lahko dodate novo vrstico na koncu datoteke:

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]

Enostavnejša možnost je, da namesto tega odstranite novo vrstico:

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

Ali celo, čeprav je precej neberljivo:

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

Pri tem se izkorišča dejstvo, da povratna vrednost funkcije or ni boolean, temveč predmet, ki je bil ovrednoten kot true ali false.


Metoda readlines je pravzaprav enakovredna:

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

Ker readline() ohrani novo vrstico, jo ohrani tudi readlines().

Note: zaradi simetrije z readlines() metoda writelines() *ne doda končnih novih vrstic, zato f2.writelines(f.readlines()) ustvari natančno kopijo f v f2.

Komentarji (7)
temp = open(filename,'r').read().split('\n')
Komentarji (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;
Komentarji (0)