Unicode (UTF-8) reading and writing to files in Python

前端 未结 14 1057
谎友^
谎友^ 2020-11-22 17:10

I\'m having some brain failure in understanding reading and writing text to a file (Python 2.4).

# The string, which has an a-acute in it.
ss = u\'Capit\\xe1         


        
相关标签:
14条回答
  • 2020-11-22 17:27
    # -*- encoding: utf-8 -*-
    
    # converting a unknown formatting file in utf-8
    
    import codecs
    import commands
    
    file_location = "jumper.sub"
    file_encoding = commands.getoutput('file -b --mime-encoding %s' % file_location)
    
    file_stream = codecs.open(file_location, 'r', file_encoding)
    file_output = codecs.open(file_location+"b", 'w', 'utf-8')
    
    for l in file_stream:
        file_output.write(l)
    
    file_stream.close()
    file_output.close()
    
    0 讨论(0)
  • 2020-11-22 17:27

    except for codecs.open(), one can uses io.open() to work with Python2 or Python3 to read / write unicode file

    example

    import io
    
    text = u'á'
    encoding = 'utf8'
    
    with io.open('data.txt', 'w', encoding=encoding, newline='\n') as fout:
        fout.write(text)
    
    with io.open('data.txt', 'r', encoding=encoding, newline='\n') as fin:
        text2 = fin.read()
    
    assert text == text2
    
    0 讨论(0)
  • 2020-11-22 17:28

    In the notation

    u'Capit\xe1n\n'
    

    the "\xe1" represents just one byte. "\x" tells you that "e1" is in hexadecimal. When you write

    Capit\xc3\xa1n
    

    into your file you have "\xc3" in it. Those are 4 bytes and in your code you read them all. You can see this when you display them:

    >>> open('f2').read()
    'Capit\\xc3\\xa1n\n'
    

    You can see that the backslash is escaped by a backslash. So you have four bytes in your string: "\", "x", "c" and "3".

    Edit:

    As others pointed out in their answers you should just enter the characters in the editor and your editor should then handle the conversion to UTF-8 and save it.

    If you actually have a string in this format you can use the string_escape codec to decode it into a normal string:

    In [15]: print 'Capit\\xc3\\xa1n\n'.decode('string_escape')
    Capitán
    

    The result is a string that is encoded in UTF-8 where the accented character is represented by the two bytes that were written \\xc3\\xa1 in the original string. If you want to have a unicode string you have to decode again with UTF-8.

    To your edit: you don't have UTF-8 in your file. To actually see how it would look like:

    s = u'Capit\xe1n\n'
    sutf8 = s.encode('UTF-8')
    open('utf-8.out', 'w').write(sutf8)
    

    Compare the content of the file utf-8.out to the content of the file you saved with your editor.

    0 讨论(0)
  • 2020-11-22 17:28

    To read in an Unicode string and then send to HTML, I did this:

    fileline.decode("utf-8").encode('ascii', 'xmlcharrefreplace')
    

    Useful for python powered http servers.

    0 讨论(0)
  • 2020-11-22 17:30

    The \x.. sequence is something that's specific to Python. It's not a universal byte escape sequence.

    How you actually enter in UTF-8-encoded non-ASCII depends on your OS and/or your editor. Here's how you do it in Windows. For OS X to enter a with an acute accent you can just hit option + E, then A, and almost all text editors in OS X support UTF-8.

    0 讨论(0)
  • 2020-11-22 17:31

    I was trying to parse iCal using Python 2.7.9:

    from icalendar import Calendar

    But I was getting:

     Traceback (most recent call last):
     File "ical.py", line 92, in parse
        print "{}".format(e[attr])
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 7: ordinal not in range(128)
    

    and it was fixed with just:

    print "{}".format(e[attr].encode("utf-8"))
    

    (Now it can print liké á böss.)

    0 讨论(0)
提交回复
热议问题