"Python" programoje skambinant
temp = open(filename,'r').readlines()
gaunamas sąrašas, kurio kiekvienas elementas yra failo eilutė. Tai šiek tiek kvaila, bet vis dėlto: readlines()
į kiekvieną elementą taip pat įrašo naujos eilutės simbolį, o to aš nenoriu, kad atsitiktų.
Kaip galėčiau to išvengti?
Galite perskaityti visą failą ir padalyti eilutes naudodami str.splitlines
:
temp = file.read().splitlines()
Arba galite pašalinti naująją eilutę rankiniu būdu:
temp = [line[:-1] for line in file]
Pastaba: pastarasis sprendimas veikia tik tuo atveju, jei failas baigiasi naująja eilute, priešingu atveju paskutinė eilutė neteks simbolio.
Ši prielaida yra teisinga daugeliu atvejų (ypač tekstiniais redaktoriais sukurtiems failams, kurie dažnai vis tiek prideda baigiamąją naująją eilutę).
Jei norite to išvengti, galite pridėti naująją eilutę failo pabaigoje:
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]
Arba paprastesnė alternatyva - vietoj naujosios eilutės įrašyti išbraukti
naująją eilutę:
[line.rstrip('\n') for line in file]
Arba net, nors ir gana neįskaitomai:
[line[:-(line[-1] == '\n') or len(line)+1] for line in file]
Naudojamasi tuo, kad or
grąžinama reikšmė yra ne loginis veiksnys, o objektas, kuris buvo įvertintas true arba false.
Metodas readlines
iš tikrųjų yra lygiavertis:
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
Kadangi readline()
išsaugo naująją eilutę, ją išsaugo ir readlines()
.
Pastaba: dėl simetrijos su readlines()
metodu writelines()
pabaigos naujosios eilutės nepridedamos, todėl f2.writelines(f.readlines())
sukuria tikslią f
kopiją 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;