Anubis13 Δημοσ. 27 Σεπτεμβρίου 2013 Δημοσ. 27 Σεπτεμβρίου 2013 (επεξεργασμένο) Εχω ενα unicode αρχειο με UCS-2 encoding και θέλω να κάνω search την λέξη text for line in input: if 'text' in line: count+=1 Αυτο δουλευει για ascii αρχειο αλλα σε unicode προφανως δεν γυρναει σωστο αποτελεσμα Αν το κανω 't e x t ' δεν δουλευει. Τι μπορω να κανω? Επεξ/σία 27 Σεπτεμβρίου 2013 από Anubis13
Anubis13 Δημοσ. 27 Σεπτεμβρίου 2013 Μέλος Δημοσ. 27 Σεπτεμβρίου 2013 Κανω το διαβασμα ετσιinput = codecs.open("test.txt", "r", "utf-16_be").readlines() Γραφω ετσι output.write(test.encode("utf-16_be")) Kαι εχω αποτελεσμα " H e l l o W o r l d " αντι για "Hello World" που εχει διαβασει Προφανως αν το σωσω με αλλη μορφη το αρχειο δεν διαβαζεται.Τι μπορω να κανω
parsifal Δημοσ. 27 Σεπτεμβρίου 2013 Δημοσ. 27 Σεπτεμβρίου 2013 Το αρχείο το δημιουργείς εσύ από το μηδέν; Αν όχι, τσέκαρε μήπως το byte order δεν είναι Big αλλά Little Endian (αυτό π.χ. είναι το default των Windows)...
pmav99 Δημοσ. 27 Σεπτεμβρίου 2013 Δημοσ. 27 Σεπτεμβρίου 2013 Κανω το διαβασμα ετσι input = codecs.open("test.txt", "r", "utf-16_be").readlines() Γραφω ετσι output.write(test.encode("utf-16_be")) Kαι εχω αποτελεσμα " H e l l o W o r l d " αντι για "Hello World" που εχει διαβασει Προφανως αν το σωσω με αλλη μορφη το αρχειο δεν διαβαζεται.Τι μπορω να κανω 1. Χρησιμοποιείς Python 2 ή 3? 2. Tabs αντί για spaces?!?!? Άλλαξε τις ρυθμίσεις του editor σου. 3. Αν θες να μετρήσεις τις λέξεις του αρχείου, τότε δες το Counter. Αν πάλι απλά να βρεις πόσες/ποιες γραμμές έχουν κάποια συγκεκριμένο string, τότε τσέκαρε μήπως οι regular expressions είναι πιο βολικές. 4. Τα αρχεία στην python τα ανοίγουν χρησιμοποιώντας το with with codecs.open(filename, mode, encoding) as f: lines = f.readlines() for line in lines: # whatever Σε Python 3 import codecs text = "φτου σκουληκομερμυγκότρυπα!" with codecs.open("/tmp/foo.txt", "w", "utf-16_be") as f: f.write(text) και import codecs with codecs.open("/tmp/foo.txt", "r", "utf-16_be") as f: text = f.read() print(text) if "φτου" in text: print(True)
Anubis13 Δημοσ. 27 Σεπτεμβρίου 2013 Μέλος Δημοσ. 27 Σεπτεμβρίου 2013 Καλημέρα, χρησιμοποιώ python 2 συγκεκριμένα έκδοση 2.7.5. Δεν εχω προβλημα με το να κανω pattern match το αρχείο αλλά με το οτι ενω το input με καποιο τρόπο διαβάζεται με το συγκεκριμένο encoding το output, ενω το αποθηκευω στο σωστο encoding φαινεται με κενα. Υπαρχει καποιος τροπος να κανω trim αυτα τα bytes?
Moderators Praetorian Δημοσ. 27 Σεπτεμβρίου 2013 Moderators Δημοσ. 27 Σεπτεμβρίου 2013 Δεν καταλαβαίνω που βρίσκεται το πρόβλημα. Ανοίγεις το αρχείο με κάποιο notepad και βλέπεις κενά; Μήπως επειδή έχει \x00 ο κάθε χαρακτήρας λόγω utf-16? # -*- coding: UTF-8 -*- import codecs def main(): # write a file with utf-16_be encoding output = codecs.open("test.txt", "w", "utf-16_be") output.write(u"Hello World\nBeep Beep\n") output.close() # read from file with utf-16_be encoding input = codecs.open("test.txt", "r", "utf-16_be") inputLines = input.readlines() input.close() # re-write the file, keep only the line with "ello" substring. Append a new unicode string at the end. # output = codecs.open("test.txt", "w", "utf-16_be") for line in inputLines: print line # unicode object print codecs.utf_16_be_encode(line) # str if u"ello" in line: output.write(line+ u"lalal\n") # write the unicode objects add something in the end output.close() # # re-open for validation # print "Re-opening" input = codecs.open("test.txt", "r", "utf-16_be") inputLines = input.readlines() for line in inputLines: if u"ello" in line: print u"Match: " + line input.close() if __name__ == '__main__': main()
παπι Δημοσ. 27 Σεπτεμβρίου 2013 Δημοσ. 27 Σεπτεμβρίου 2013 Σε ειπα να δεις για string prefix. Αποτι βλεπω στο παραπανω, για να γραψεις στην python ενα unicode string πρεπρει να βαλεις το u μπροστα απο το τανγκα. πχ myUnicodeString = u"Hello this is unicode"
pmav99 Δημοσ. 27 Σεπτεμβρίου 2013 Δημοσ. 27 Σεπτεμβρίου 2013 για να γραψεις στην python ενα unicode string πρεπρει να βαλεις το u μπροστα απο το τανγκα. Διευκρίνηση. Στην python 2 αυτό. Στην Python 3 όλα τα strings είναι unicode. Στην Python 3.0 - 3.2 το prefix "u" είχε καταργηθεί. Στην 3.3 το u επανήλθε (και δεν κάνει τίποτα γιατί το string είναι ήδη unicode) για να κάνει ευκολότερη τη μετάβαση του υφιστάμενου κώδικα από python 2 σε python 3.
Anubis13 Δημοσ. 28 Σεπτεμβρίου 2013 Μέλος Δημοσ. 28 Σεπτεμβρίου 2013 (επεξεργασμένο) @Praetorian: Συμφωνω εχουμε προγραμμα ιδιας λογικης. Η ερωτηση μου ειναι μπορω να παρω output σε αρχειο χωρις να εχω τα κενα των χαρακτηρων το \x00. Δοκιμασα exclude με strip αλλα δεν δουλεψε(δουλευει για την αρχη και το τελος). Edit: το βρηκα, test2 = test2.replace('\x00', '') Εμπνευση στις 4 το πρωι..τωρα μπορουμε να κοιμηθουμε Επεξ/σία 28 Σεπτεμβρίου 2013 από Anubis13
Moderators Praetorian Δημοσ. 28 Σεπτεμβρίου 2013 Moderators Δημοσ. 28 Σεπτεμβρίου 2013 Βασικά το προγραμματάκι το έγραψα στο πόδι, γα να κάνω κάτι παρόμοιο με αυτό που κάνεις και να δείξω ότι δεν υπάρχει κάποιο πρόβλημα αν με κάποιο notepad (ή notepad++) βλέπεις NULL characters στο test.txt. Ένας text editor που υποστηρίζει utf-16 (από google search: babelpad, xpad) θα δείξει το κείμενο χωρίς "κενά". Τώρα μέσα στην python αν θέλεις να δουλεύεις με 8bit strs για οποιοδήποτε λόγο (γιατί όχι με το unicode αντικείμενο; ) θα μπορούσες να αλλάξεις το encoding του string σε utf-8 ή οτιδήποτε άλλο 8bit σε βολεύει.
Anubis13 Δημοσ. 29 Σεπτεμβρίου 2013 Μέλος Δημοσ. 29 Σεπτεμβρίου 2013 (επεξεργασμένο) Να ρωτησω και κατι αλλο. Αν καποιος απο τους χαρακτηρες δεν εμφανιζεται στην γλωσσα των windows μου ειναι λογικο να μην γινεται copy σωστα? Aν και κανοντας copy/paste ενα τετοιο χαρακτηρα σε notepad δουλευει. Edit: lesson learnt. Open everything with firefox. Επεξ/σία 29 Σεπτεμβρίου 2013 από Anubis13
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα