当前位置:   article > 正文

[Python]_[初级]_[使用open函数生成文件需要注意换行符问题]_open读出的路径带\r

open读出的路径带\r

场景

  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
  • 2
  • 3
  • 4
  • 5
  1. 在各系统里的换行符要求:
Windows: \r\n:
Linux: \n
macOS: 可以是\r或者\r\n
  • 1
  • 2
  • 3

例子

  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

参考

  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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/278364
推荐阅读
相关标签
  

闽ICP备14008679号