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?
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
.
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;