代码之家  ›  专栏  ›  技术社区  ›  Oniow

Python 3:沿着side unicode向文本文件写入新行的问题

  •  1
  • Oniow  · 技术社区  · 9 年前

    我在python 3中编写文本文件的头时遇到了一个问题。 我有一个包含unicode和新行字符的标题。以下是一个最低限度的工作示例:

    with open('my_log.txt', 'wb') as my_file:
        str_1 = '\u2588\u2588\u2588\u2588\u2588\n\u2588\u2588\u2588\u2588\u2588'
        str_2 = 'regular ascii\nregular ascii'
        my_file.write(str_1.encode('utf8'))
        my_file.write(bytes(str_2, 'UTF-8'))
    

    除了输出文件没有新行(基本上看起来像是我用“”替换了“\n”)之外,以上操作都有效。如下所示:

    ████████regular asciiregular ascii
    

    我期待着:

    ████
    ████
    regular ascii
    regular ascii
    

    基于类似的问题,我尝试用u“\u000A”和其他字符替换“\n”,但我得到了相同的结果。

    还有一个可能是相关的问题:我知道我用上面的编码和字节方法让我的生活变得更加艰难。仍然习惯于py3中的unicode,所以任何关于这方面的建议都会很好,谢谢!

    编辑 根据Ignacio的回应和更多研究:以下内容似乎产生了预期结果(基本上从“\n”转换为“\r\n”,并确保所有行的编码都正确):

    with open('my_log.txt', 'wb') as my_file:
        str_1 = '\u2588\u2588\u2588\u2588\u2588\r\n\u2588\u2588\u2588\u2588\u2588'
        str_2 = '\r\nregular ascii\r\nregular ascii'
        my_file.write(str_1.encode('utf8'))
        my_file.write(str_2.encode('utf8'))
    
    2 回复  |  直到 9 年前
        1
  •  3
  •   Mark Tolonen    9 年前

    既然你提到想要在Python 3上使用Unicode的建议。。。

    您可能从 \n 在二进制模式下无法正常工作。Linux使用 \n个 文本的行尾,但Windows使用 \r\n .

    以文本模式打开文件并声明所需的编码,然后只编写Unicode字符串。下面是一个包含Unicode不同转义码的示例:

    #coding:utf8
    str_1 = '''\
    \u2588\N{FULL BLOCK}\U00002588█
    regular ascii'''
    
    with open('my_log.txt', 'w', encoding='utf8') as my_file:
        my_file.write(str_1)
    

    您可以使用四位数转义 \uxxxx ,八位转义 \Uxxxxxxxx ,或Unicode代码点 \N{codepoint_name} 。Unicode字符也可以直接在文件中使用,只要 #coding: 声明存在,并且源代码文件以声明的编码保存。

    请注意,Python 3的默认源代码编码为 utf8 所以我上面使用的声明是可选的,但在Python 2上,默认值是 ascii 。源编码不必与用于打开文件的编码匹配。

    使用 w wt 用于编写文本( t 是默认值)。在Windows上 \n个 将转换为 \\r\n 在文本模式下。

        2
  •  1
  •   Ignacio Vazquez-Abrams    9 年前

    'wb'

    文件以二进制模式打开。像这样的 \n 未转换为本机换行格式。如果在不将LF视为换行符的文本编辑器中打开文件,则所有文本将显示在编辑器中的一行上。使用适当的编码以文本模式打开文件,或者在写入之前手动翻译换行。