Προς το περιεχόμενο

Unicode string python


Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Εχω ενα unicode αρχειο με UCS-2 encoding και θέλω να κάνω search την λέξη text

for line in input:
	if 'text' in line:
		count+=1

Αυτο δουλευει για ascii αρχειο αλλα σε unicode προφανως δεν γυρναει σωστο αποτελεσμα

Αν το κανω 't e x t ' δεν δουλευει. Τι μπορω να κανω?

Επεξ/σία από Anubis13
Δημοσ.

Κανω το διαβασμα ετσι
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" που εχει διαβασει

 

Προφανως αν το σωσω με αλλη μορφη το αρχειο δεν διαβαζεται.Τι μπορω να κανω

Δημοσ.

Το αρχείο το δημιουργείς εσύ από το μηδέν; Αν όχι, τσέκαρε μήπως το byte order δεν είναι Big αλλά Little Endian (αυτό π.χ. είναι το default των Windows)...

Δημοσ.

Κανω το διαβασμα ετσι

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)
Δημοσ.

Καλημέρα,

χρησιμοποιώ python 2 συγκεκριμένα έκδοση 2.7.5. Δεν εχω προβλημα με το να κανω pattern match το αρχείο αλλά με το οτι ενω το input με καποιο τρόπο διαβάζεται με το συγκεκριμένο encoding το output, ενω το αποθηκευω στο σωστο encoding φαινεται με κενα. Υπαρχει καποιος τροπος να κανω trim αυτα τα bytes?

  • Moderators
Δημοσ.

Δεν καταλαβαίνω που βρίσκεται το πρόβλημα. Ανοίγεις το αρχείο με κάποιο 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()
Δημοσ.

Σε ειπα να δεις για string prefix. Αποτι βλεπω στο παραπανω, για να γραψεις στην python ενα unicode string πρεπρει να βαλεις το u μπροστα απο το τανγκα. 

πχ

myUnicodeString = u"Hello this is unicode"
Δημοσ.

για να γραψεις στην 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.

Δημοσ. (επεξεργασμένο)

@Praetorian:

Συμφωνω εχουμε προγραμμα ιδιας λογικης. Η ερωτηση μου ειναι μπορω να παρω output σε αρχειο χωρις να εχω τα κενα των χαρακτηρων το \x00. Δοκιμασα exclude με strip αλλα δεν δουλεψε(δουλευει για την αρχη και το τελος).

 

Edit: το βρηκα,

test2 = test2.replace('\x00', '')

 

Εμπνευση στις 4 το πρωι..τωρα μπορουμε να κοιμηθουμε :)

Επεξ/σία από Anubis13
  • Moderators
Δημοσ.

Βασικά το προγραμματάκι το έγραψα στο πόδι, γα να κάνω κάτι παρόμοιο με αυτό που κάνεις και να δείξω ότι δεν υπάρχει κάποιο πρόβλημα αν με κάποιο notepad (ή notepad++) βλέπεις NULL characters στο test.txt. Ένας text editor που υποστηρίζει utf-16 (από google search: babelpad, xpad) θα δείξει το κείμενο χωρίς "κενά".

Τώρα μέσα στην python αν θέλεις να δουλεύεις με 8bit strs για οποιοδήποτε λόγο (γιατί όχι με το unicode αντικείμενο; ) θα μπορούσες να αλλάξεις το encoding του string σε utf-8 ή οτιδήποτε άλλο 8bit σε βολεύει.

Δημοσ. (επεξεργασμένο)

Να ρωτησω και κατι αλλο. Αν καποιος απο τους χαρακτηρες δεν εμφανιζεται στην γλωσσα των windows μου ειναι λογικο να μην γινεται copy σωστα? Aν και κανοντας copy/paste ενα τετοιο χαρακτηρα σε notepad δουλευει.

 

Edit: lesson learnt. Open everything with firefox.

Επεξ/σία από Anubis13

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...