解决linux python3写入txt文件中换行始终显示"\r\n"

问题环境:
在Linux上运行python3脚本远程登录设备,远程发送指令,并把指令的回显写入文件。

出现的问题:
正常应该显示的换行始终被显示成\r\n问题,在windows上能够正常显示

涉及的问题原因:

  1. windows和linux上对文本处理的差异
  2. 文本方式与二进制方式打开文件的区别
  3. paramiko中recv()获取的内容类型
  4. python3的编码格式

使用到的代码:
paramiko ssh登录代码
#在SSH server端创建一个交互式的shell,且可以按自己的需求配置伪终端,可以在invoke_shell()函数中添加参数配置。
remote_conn = ssh.invoke_shell()
remote_conn.send(‘ls\n’)
data=remote_conn.recv(10000)
fo=open(’/var/ftp/work/HELLO_WORD/test1.txt’,‘w’)
fo.write(data)

#仅供参考代码,不是实际执行代码

问题解决:
写入文本的格式编码转换。
修改后的代码
data=remote_conn.recv(10000).decode(‘utf-8’)

主要理清ssh发送指令接收到的内容的类型,文件读写内容类型就可以解决问题了。

  1. data=remote_conn.recv(10000)
    这个函数recv()在Linux python中收到的内容类型是bytes,在设备上显示默认使用utf-8格式
    print(type(remote_conn.recv(10000)))

  2. fo=open(’/var/ftp/work/HELLO_WORD/test1.txt’,‘w’)
    fo.write(data)
    以‘w’打开文件并写入,会报错
    Traceback (most recent call last):
    File “”, line 1, in
    TypeError: write() argument must be str, not bytes
    意思是写入的必须是string类型而不是bytes
    解决这个问题有两种方法,一种是把文件打开方式改成二进制把‘w’改成‘wb’;还有一种就是把写入的data改成string类型

但是这些都不能解决写入含有"\r\n"的问题
原本以为是因为文本方式和二进制方式打开文件的区别
Windows平台下
如果以“文本”方式打开文件,当读取文件的时候,系统会将所有的"/r/n"转换成"/n";当写入文件的时候,系统会将"/n"转换成"/r/n"写入。
如果以"二进制"方式打开文件,则读/写都不会进行这样的转换。
在Unix/Linux平台下
“文本”与“二进制”模式没有区别。

但是后来发现linux没有区别,就不是打开文件类型的问题。

在网上找解决方法的时候,注意到decode()和encode()函数,才发现是引文解码问题导致的。
应该是通过ssh发送的指令收到的回显是utf-8格式的,type utf-8格式显示的是bytes类型,就以为传回是二进制,转换为str再写入就把\r\n一起显示出来,把utf-8格式解码成unicode类型再写入就没有问题了。

  1. Python3默认编码是unicode;而Python2是ASCII码。Windows环境默认是gbk编码。参考 https://www.cnblogs.com/yunguoxiaoqiao/p/7588725.html

  2. 手动转码规则

      UTF-8 --> decode 解码 --> Unicode
      Unicode --> encode 编码 --> GBK / UTF-8 等
    

把写入的内容解码成utf-8,就可以解决问题了。

你可能感兴趣的:(linux,python)