[Python]_[初级]_[使用open函数生成文件需要注意换行符问题]

Posted infoworld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python]_[初级]_[使用open函数生成文件需要注意换行符问题]相关的知识,希望对你有一定的参考价值。

场景

  1. linux上执行shell脚本时出现$’\\r’:command not found错误. 在Windows上打开.sh文件是能正常显示的,怎么回事?

  2. 使用Python生成的utf-8格式的文件为什么print函数设置了end="\\n"还是输出十六进制的0D0A, 不应该只输出0A吗?

说明

  1. Linux上的Bash shell脚本文件是严格规定了必须\\n(0A)作为换行符, 因此如果在Windows上生成的文件以\\r\\n作为换行符的话, 执行这个shell文件时会报错的。

  2. Python上使用内置open()函数来创建一个文本文件对象TextIOBase超类,而具体的实现子类是<class '_io.TextIOWrapper'>,可以通过print(type(f))获得.

  3. 这个open()函数[3]是有坑的,在输出流的描述里,如果newline不指定,那么任何的\\n会自动转义为系统的默认换行符,也就是在Windows下生成的文件,遇到\\n写入自动会转换为\\r\\n, 也就是十六进制0D0A, 所以生成的文件放到Linux上执行就会报上边的错误。解决办法就是在使用open()时指定newline参数。

newline controls how universal newlines mode works (it only applies to text mode). It can be None, '', '\\n', '\\r', and '\\r\\n'. It works as follows:
    
    - When reading input from the stream, if newline is None, universal newlines mode is enabled. Lines in the input can end in '\\n', '\\r', or '\\r\\n', and these are translated into '\\n' before being returned to the caller. If it is '', universal newlines mode is enabled, but line endings are returned to the caller untranslated. If it has any of the other legal values, input lines are only terminated by the given string, and the line ending is returned to the caller untranslated.
    
    - When writing output to the stream, if newline is None, any '\\n' characters written are translated to the system default line separator, os.linesep. If newline is '' or '\\n', no translation takes place. If newline is any of the other legal values, any '\\n' characters written are translated to the given string.
  1. 在各系统里的换行符要求:
Windows: \\r\\n:
Linux: \\n
macOS: 可以是\\r或者\\r\\n

例子

  1. 这里在Windows系统下输出文件,并使用winhex查看文件的十六进制。


if __name__ == '__main__':
    print("hello world")
    f = open("1.txt","w", encoding="utf-8")
    f.write("a\\na\\ra\\na") # 61 0D 0A 61 0D 61 0D 0A 61

    print(type(f))
    f.close()

    f = open("2.txt", "w", encoding="utf-8",newline="\\n")
    f.write("a\\na\\ra") # 61 0A 61 0D 61
    f.close()

    f = open("3.txt", "w", encoding="utf-8", newline="\\n")
    print("%s\\na\\ra " % "a",end="\\n",file=f) # 61 0A 61 0D 61 20 0A
    f.close()

参考

  1. print-lf-with-python-3-to-windows-stdout

  2. Linux、Windows 和 Mac 中的换行符对比

  3. io — Core tools for working with streams — Python 3.10.1 documentation

以上是关于[Python]_[初级]_[使用open函数生成文件需要注意换行符问题]的主要内容,如果未能解决你的问题,请参考以下文章

[Python]_[初级]_[使用open函数生成文件需要注意换行符问题]

[Python]_[初级]_[内置函数map讲解]

[Python]_[初级]_[内置函数map讲解]

Python 第四篇:生成器与迭代器

《python核心教程2》第十章 练习

[Java]_[初级]_[使用easyexcel生成或下载Excel文件]