Στην Python, η κλήση του
temp = open(filename,'r').readlines()
οδηγεί σε μια λίστα στην οποία κάθε στοιχείο είναι μια γραμμή του αρχείου. Είναι λίγο ανόητο, αλλά και πάλι: η readlines()
γράφει επίσης χαρακτήρα νέας γραμμής σε κάθε στοιχείο, κάτι που δεν θέλω να συμβεί.
Πώς μπορώ να το αποφύγω;
Μπορείτε να διαβάσετε ολόκληρο το αρχείο και να διαχωρίσετε τις γραμμές χρησιμοποιώντας 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]
Ή μια απλούστερη εναλλακτική λύση είναι να "κόψετε" τη νέα γραμμή:
[line.rstrip('\n') for line in file]
Ή ακόμα, αν και αρκετά δυσανάγνωστο:
[line[:-(line[-1] == '\n') or len(line)+1] for line in file]
Το οποίο εκμεταλλεύεται το γεγονός ότι η τιμή επιστροφής του or
δεν είναι ένα boolean, αλλά το αντικείμενο που αξιολογήθηκε 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())
παράγει ένα ακριβές αντίγραφο της f
στην 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;