Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将Unicode文本写入文本文件?_Python_Unicode_Character Encoding_Python 2.x - Fatal编程技术网

Python 将Unicode文本写入文本文件?

Python 将Unicode文本写入文本文件?,python,unicode,character-encoding,python-2.x,Python,Unicode,Character Encoding,Python 2.x,我从谷歌文档中提取数据,对其进行处理,并将其写入一个文件(最终我将粘贴到Wordpress页面) 它有一些非ASCII符号。如何将这些安全地转换为可以在HTML源代码中使用的符号 目前,我正在将所有内容转换为Unicode,将所有内容合并到一个Python字符串中,然后执行以下操作: import codecs f = codecs.open('out.txt', mode="w", encoding="iso-8859-1") f.write(all_html.encode("iso-8859

我从谷歌文档中提取数据,对其进行处理,并将其写入一个文件(最终我将粘贴到Wordpress页面)

它有一些非ASCII符号。如何将这些安全地转换为可以在HTML源代码中使用的符号

目前,我正在将所有内容转换为Unicode,将所有内容合并到一个Python字符串中,然后执行以下操作:

import codecs
f = codecs.open('out.txt', mode="w", encoding="iso-8859-1")
f.write(all_html.encode("iso-8859-1", "replace"))
最后一行有编码错误:

UnicodeDecodeError:“ascii”编解码器无法解码位置中的字节0xa0 12286:序号不在范围内(128)

部分解决方案:

此Python运行时没有错误:

row = [unicode(x.strip()) if x is not None else u'' for x in row]
all_html = row[0] + "<br/>" + row[1]
f = open('out.txt', 'w')
f.write(all_html.encode("utf-8"))

也许我需要写一个文本文件以外的东西

编解码器打开的文件。open
是一个文件,它接受
unicode
数据,在
iso-8859-1
中对其进行编码并将其写入文件。然而,您尝试编写的不是unicode;您自己使用
unicode
并在
iso-8859-1
中对其进行编码。这就是
unicode.encode
方法所做的,对unicode字符串进行编码的结果是一个bytestring(一个
str
类型)


您应该使用普通的
open()
自己编码unicode,或者(通常是更好的主意)使用
codecs.open()
自己不编码数据。

当您尝试编码非unicode字符串时,会出现错误:它尝试解码它,假设它是纯ASCII。有两种可能性:

  • 您正在将其编码为bytestring,但由于您使用了codecs.open,write方法需要一个unicode对象。所以你对它进行编码,它会再次尝试解码。试试:
    f.write(全部html)
  • 事实上,并非所有的html都是unicode对象。当您执行
    .encode(…)
    时,它首先尝试对其进行解码

  • 通过在第一次获取unicode对象时将其解码为unicode对象,并根据需要对其进行编码,尽可能地专门处理unicode对象

    如果字符串实际上是unicode对象,则在将其写入文件之前,需要将其转换为unicode编码的字符串对象:

    foo = u'Δ, Й, ק, ‎ م, ๗, あ, 叶, 葉, and 말.'
    f = open('test', 'w')
    f.write(foo.encode('utf8'))
    f.close()
    
    再次读取该文件时,您将得到一个unicode编码的字符串,您可以将其解码为unicode对象:

    f = file('test', 'r')
    print f.read().decode('utf8')
    

    如何将unicode字符打印到文件中:

    将此保存到文件:foo.py:

    #!/usr/bin/python -tt
    # -*- coding: utf-8 -*-
    import codecs
    import sys 
    UTF8Writer = codecs.getwriter('utf8')
    sys.stdout = UTF8Writer(sys.stdout)
    print(u'e with obfuscation: é')
    
    运行它并将输出导入文件:

    python foo.py > tmp.txt
    
    打开tmp.txt并查看内部,您会看到:

    el@apollo:~$ cat tmp.txt 
    e with obfuscation: é
    
    因此,您已经将带有模糊标记的unicode e保存到一个文件中。

    在Python 2.6+中,您可以在Python 3中使用默认值()

    import io
    
    with io.open(filename, 'w', encoding=character_encoding) as file:
        file.write(unicode_text)
    
    import io
    
    如果您需要以增量方式写入文本(您不需要多次调用
    unicode\u text.encode(character\u encoding)
    ),可能会更方便。与
    编解码器
    模块不同,
    io
    模块具有适当的通用换行符支持。

    前言:您的查看器可以工作吗? 确保您的查看器/编辑器/终端(无论您如何与utf-8编码文件交互)可以读取该文件。这通常是记事本上的一个问题

    将Unicode文本写入文本文件? 在Python 2中,使用
    io
    模块中的
    open
    (这与Python 3中的内置
    open
    相同):

    一般来说,最佳实践是使用
    UTF-8
    写入文件(我们甚至不必担心UTF-8的字节顺序)

    utf-8是最现代、最通用的编码——它适用于所有web浏览器、大多数文本编辑器(如果有问题,请参阅您的设置)和大多数终端/外壳

    在Windows上,如果您仅限于在记事本(或其他受限查看器)中查看输出,则可以尝试使用
    utf-16le

    只需使用上下文管理器打开它并写出您的unicode字符:

    with io.open(filename, 'w', encoding=encoding) as f:
        f.write(unicode_object)
    
    使用许多Unicode字符的示例 下面是一个示例,它尝试将数字表示(以整数表示)中最多三位宽的每个可能字符(4是最大值,但这可能有点远)映射到编码的可打印输出,如果可能的话,还包括其名称(将其放入名为
    uni.py
    )的文件中):

    这应该运行大约一分钟,您可以查看数据文件,如果您的文件查看器可以显示unicode,您将看到它。可以找到有关类别的信息。基于这些计数,我们可能可以通过排除Cn和Co类别来改进我们的结果,因为它们没有相关符号

    $ python uni.py
    
    它将显示十六进制映射、符号(除非无法获取名称,所以可能是控制字符)和符号的名称。e、 g

    我建议在Unix或Cygwin上使用
    less
    (不要将整个文件打印/cat到输出中):

    e、 g.将显示类似于我使用Python 2(unicode 5.2)从中采样的以下行:


    我从Anaconda开发的Python3.5有unicode 8.0,我想大多数3都有。

    unicode字符串处理在Python3中已经标准化了

  • 字符已经存储在内存中的Unicode(32位)中
  • 您只需要在utf-8中打开文件
    (从内存到文件自动执行32位Unicode到可变字节长度utf-8的转换。)


  • 如果是用蟒蛇3写的话

    >>> a = u'bats\u00E0'
    >>> print a
    batsà
    >>> f = open("/tmp/test", "w")
    >>> f.write(a)
    >>> f.close()
    >>> data = open("/tmp/test").read()
    >>> data
    'batsà'
    

    如果使用python2书写:

    >>> a = u'bats\u00E0'
    >>> f = open("/tmp/test", "w")
    >>> f.write(a)
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
    
    并在读取时使用编解码器“utf-8”解码数据:

    而且,如果您尝试在这个字符串上执行print,它将自动使用“utf-8”编解码器进行解码,如下所示

    >>> print a
    batsà
    

    谢谢这运行时没有错误,但是如果我打开文本文件,我会看到一堆奇怪的符号:)我需要将文本复制并粘贴到Wordpress页面(不要问)。有没有什么方法可以把那里的符号打印出来?我猜不是一个txt文件,对吧,但可能是其他文件?你用什么打开文本文件?我猜你是在Windows上,你是在记事本上打开的,而记事本对编码来说并不太智能。在写字板中打开时会发生什么
    $ python uni.py
    
    $ less unidata
    
         0 Cc NUL
        20 Zs     SPACE
        21 Po  !  EXCLAMATION MARK
        b6 So  ¶  PILCROW SIGN
        d0 Lu  Ð  LATIN CAPITAL LETTER ETH
       e59 Nd  ๙  THAI DIGIT NINE
      2887 So  ⢇  BRAILLE PATTERN DOTS-1238
      bc13 Lo  밓  HANGUL SYLLABLE MIH
      ffeb Sm  →  HALFWIDTH RIGHTWARDS ARROW
    
    out1 = "(嘉南大圳 ㄐㄧㄚ ㄋㄢˊ ㄉㄚˋ ㄗㄨㄣˋ )"
    fobj = open("t1.txt", "w", encoding="utf-8")
    fobj.write(out1)
    fobj.close()
    
    >>> a = u'bats\u00E0'
    >>> print a
    batsà
    >>> f = open("/tmp/test", "w")
    >>> f.write(a)
    >>> f.close()
    >>> data = open("/tmp/test").read()
    >>> data
    'batsà'
    
    >>> a = u'bats\u00E0'
    >>> f = open("/tmp/test", "w")
    >>> f.write(a)
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
    
    >>> f.write(a.encode("utf-8"))
    >>> f.close()
    
    >>> data = open("/tmp/test").read()
    >>> data.decode("utf-8")
    u'bats\xe0'
    
    >>> print a
    batsà