Steadier Δημοσ. 24 Νοεμβρίου 2016 Δημοσ. 24 Νοεμβρίου 2016 πρεπει να γραψω ενα ενα κωδικα για να διαγραφει τις κενες γραμμες απο ενα κειμενο (.txt).εγραψα αυτο, with open('C:\\Users\\Desktop\\test.txt','r') as input: for line in input: line=line.strip() if line !=' ': print(line) και μεχρι εδω ειναι σωστο, αλλα αν προσπαθησω να το γραψω σε ενα .txt with open('C:\\Users\\Desktop\\test.txt','r') as input: for line in input: line=line.strip() if line !=' ': with open('C:\\Users\\Desktop\\test.txt','w') as out: out.write(line) διαγραφει ολες τις γραμμες εχτος την τελευταια. καποια βοηθεια?
kstavrid Δημοσ. 24 Νοεμβρίου 2016 Δημοσ. 24 Νοεμβρίου 2016 Η λογική που τρέχεις δεν είναι και τόσο πρακτική.. Μπορείς να γράψεις τις γραμμές που δεν είναι κενές σε ένα άλλο txt και αφού τελειώσεις απλά διαγράφεις το παλιό και κάνεις rename το καινούργιο με το όνομα του παλιού. Επίσης ΠΑΝΤΑ πρέπει να ελέγχεις αν υπάρχει το αρχείο πριν δουλέψεις πάνω του. π.χ. #!/usr/bin/python ## για λειτουργιες os ## import os ## ελεγχεις αν υπαρχει το file ΠΑΝΤΑ ## if os.path.isfile( file path ): ## εδω κανεις τη δουλεια σου ## else: ## error msg ## Για να φτιάξεις καινούργιο αρχείο απλά ανοίγεις ένα που δεν υπάρχει, έτσι η python θα σου φτιάξει ένα άδειο file. Για να διαγράψεις ένα αρχείο κάνεις το εξής ## χρησιμοποιείς try για να πιάσεις την περιπτωση exception ## try: os.remove( file ) except OSError, e: ## αν δεν πετυχε η διαγραφη, αντι για να πεταξει exception, κανει print ενα error msg ## print ("Error: %s - %s." % (e.filename,e.strerror)) Τέλος για rename κάνεις το εξής (μπορείς και εδώ να έχεις try) os.rename('oldName','newName')
k33theod Δημοσ. 24 Νοεμβρίου 2016 Δημοσ. 24 Νοεμβρίου 2016 (επεξεργασμένο) όταν βγαίνει ο κώδικας έξω από το intent του with το αρχείο κλείνει.Βάλε τα with μαζί Δεν πρόσεξα ότι χρησιμοποιείς ίδιο αρχείο για να γράψεις πρέπει να είναι άλλο το αρχείο. Επεξ/σία 25 Νοεμβρίου 2016 από k33theod
iceblade Δημοσ. 26 Νοεμβρίου 2016 Δημοσ. 26 Νοεμβρίου 2016 Τα πράγματα είναι απλά: with open('file_in.txt', 'r') as fin, open('file_out.txt', 'w') as fo: fo.write(''.join([line for line in fin.readlines() if line != '\n'])) Επίσης ΠΑΝΤΑ πρέπει να ελέγχεις αν υπάρχει το αρχείο πριν δουλέψεις πάνω του. π.χ. #!/usr/bin/python ## για λειτουργιες os ## import os ## ελεγχεις αν υπαρχει το file ΠΑΝΤΑ ## if os.path.isfile( file path ): ## εδω κανεις τη δουλεια σου ## else: ## error msg ## Δεν είναι αυτή η σωστή λογική στην Python. Δεν ελέγχεις αν υπάρχει το αρχείο απλά το κάνεις wrap σε try except και πιάνεις το FileNotFoundException
kstavrid Δημοσ. 26 Νοεμβρίου 2016 Δημοσ. 26 Νοεμβρίου 2016 Τα πράγματα είναι απλά: with open('file_in.txt', 'r') as fin, open('file_out.txt', 'w') as fo: fo.write(''.join([line for line in fin.readlines() if line != '\n'])) Δεν είναι αυτή η σωστή λογική στην Python. Δεν ελέγχεις αν υπάρχει το αρχείο απλά το κάνεις wrap σε try except και πιάνεις το FileNotFoundException Δεν είχα καν σκοπό να μιλήσω για exceptions στον φίλο γιατί δεν ξέρω σε τι επίπεδο βρίσκεται και από ότι κατάλαβα μάλλον είναι σε ακαδημαικο. Μετά σκέφτηκα να του αναφέρω έτσι πεταχτά οτι υπάρχουν οι exceptions pretty much σε όλες τις γλώσσες που θα γράψει στη συνέχεια ώστε να αρχίσει να μπαίνει στο κλίμα. Οπότε προφανώς δεν τον έριξα με τη μια σε eafp λογική, καλύτερα να τα καταλάβει πρώτα με lbyl λογική και μετά να πάει μόνος στην eafp ξέρωντας τα προτερηματα της. 1
Ψιτ Δημοσ. 26 Νοεμβρίου 2016 Δημοσ. 26 Νοεμβρίου 2016 Μην κουράζεσαι αδερφέ: $ grep -v '^$' input.txt > output.txt
kstavrid Δημοσ. 26 Νοεμβρίου 2016 Δημοσ. 26 Νοεμβρίου 2016 Μην κουράζεσαι αδερφέ: $ grep -v '^$' input.txt > output.txt χαχαχαχα αν είναι να πάει εκεί το παιδί καλύτερα να το κάνει με sed για να γλυτώσει και bus traffic. Λογικά καμια άσκηση θα είναι από τη σχολή του ή κάτι τέτοιο.
tsofras Δημοσ. 26 Νοεμβρίου 2016 Δημοσ. 26 Νοεμβρίου 2016 Χωρίς να ξέρω Python δοκίμασε το παρακάτω (φτιάξε το Indentation δεν έχω python compiler να το δοκιμάσω) //read all the file lines with open('C:\\Users\\Desktop\\test.txt','r') as input: lines = input.readlines() input.close() //reopen file in write mode and write the not null values with open('C:\\Users\\Desktop\\test.txt','w') as out: for line in lines: if line !=' ': out.write(line) out.close() Αν και θεωρώ καλύτερη επιλογή να γράψεις σε ένα νέο αρχείο κατευθείαν γιατί σε μεγάλα αρχεία θα χρειάζεσαι αρκετή μνήμη με αυτό τον τρόπο. Οπότε αλλάζεις στον κώδικα που έχεις το όνομα του αρχείου του out , το μετακινείς και έξω απο την for (γιατί εκεί που το έχεις το ανοίγεις συνέχεια και πιθανόν είναι αυτό το θέμα σου) και τέλος πάντα να φροντίζεις να κλείνεις τα αρχεία
k33theod Δημοσ. 26 Νοεμβρίου 2016 Δημοσ. 26 Νοεμβρίου 2016 Τα πράγματα είναι απλά: with open('file_in.txt', 'r') as fin, open('file_out.txt', 'w') as fo: fo.write(''.join([line for line in fin.readlines() if line != '\n'])) Δεν είναι αυτή η σωστή λογική στην Python. Δεν ελέγχεις αν υπάρχει το αρχείο απλά το κάνεις wrap σε try except και πιάνεις το FileNotFoundException iceblade το strip χρειάζεται μπορεί η κενή γραμμή να είναι ' \n' ή '\t\n' οπότε το σωστό είναι with open('file_in.txt', 'r') as fin, open('file_out.txt', 'w') as fo: fo.write(''.join([line for line in fin.readlines() if line.strip() != ''])) Χωρίς να ξέρω Python δοκίμασε το παρακάτω (φτιάξε το Indentation δεν έχω python compiler να το δοκιμάσω) //read all the file lines with open('C:\\Users\\Desktop\\test.txt','r') as input: lines = input.readlines() input.close() //reopen file in write mode and write the not null values with open('C:\\Users\\Desktop\\test.txt','w') as out: for line in lines: if line !=' ': out.write(line) out.close() Αν και θεωρώ καλύτερη επιλογή να γράψεις σε ένα νέο αρχείο κατευθείαν γιατί σε μεγάλα αρχεία θα χρειάζεσαι αρκετή μνήμη με αυτό τον τρόπο. Οπότε αλλάζεις στον κώδικα που έχεις το όνομα του αρχείου του out , το μετακινείς και έξω απο την for (γιατί εκεί που το έχεις το ανοίγεις συνέχεια και πιθανόν είναι αυτό το θέμα σου) και τέλος πάντα να φροντίζεις να κλείνεις τα αρχεία Το ίδιο για το strip
iceblade Δημοσ. 28 Νοεμβρίου 2016 Δημοσ. 28 Νοεμβρίου 2016 iceblade το strip χρειάζεται μπορεί η κενή γραμμή να είναι ' \n' ή '\t\n' οπότε το σωστό είναι with open('file_in.txt', 'r') as fin, open('file_out.txt', 'w') as fo: fo.write(''.join([line for line in fin.readlines() if line.strip() != ''])) Το ίδιο για το strip Σωστός!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα