修改文件中的换行符
dos 格式文件传输到 unix 系统时,会在每行的结尾多一个 ^M, 而此文件若是一个可执行文件的话,会导致此文件不能被执行.
在网上搜了半天, 竟然没有靠谱的, 所以决定自己研究一下吧.
dos2unix
在 centos 下安装 dos2unix:
yum install -y dos2unix
安装完成后,对文件进行转换
dos2unix abc.sh
通过 vim 转换单文件转换
vi exec.sh
:set ff=unix (或者:set fileformat=unix)
:wq
在 shell 脚本中批量转换
for file in $(ls *sh)
do
vi +':w ++ff=unix' +':q' ${file}
done
通过Python脚本转换
第一种方式
因为在本文件中替换, 需要把文件内容全部加载到内存中, 对于大文件来说比较占内存
with open('main123.py', 'r+b') as f:
# 读取文件所有内容, 大文件不要用
s = f.read()
# 替换换行符
s = s.replace(b'\r\n', b'\n')
# 清空文件内容
f.seek(0)
f.truncate()
# 写入文件
f.write(s)
- 模式用
r+b
, 因为模式'w+'
与'w+b'
将打开文件并清空内容。 模式'r+'
与'r+b'
将打开文件并不清空内容。 - 把二进制的
b'\r\n'
替换为二进制的b'\n'
- 用
seek(0)
把偏移量设置为0, 定为到文本开头 truncate(size=None)
: 将流的大小调整为给定的大小(以字节为单位)(如果没有指定大小,则为当前位置)。当前位置就是上一步设置的0
。返回新的文件大小。
第二种方式
f1 = open('main123.py', 'r', encoding = 'utf-8')
f2 = open('main1234.py', 'w', newline='\n')
for line in f1:
f2.write(line)
f1.close()
f2.close()
从一个文件中读取, 然后写入的另一个文件.
这里主要是运用了 newline
参数. 官方的介绍是:
newline
控制 换行符 如何生效(它仅适用于文本模式)。它可以是 None
,''
,'\n'
,'\r'
和 '\r\n'
。它的工作原理:
- 读取文件时,按照 newline值分行
- 写入文件时,如果 newline 为
None
,则系统默认行分隔符。如果 newline 是''
或'\n'
,则不进行翻译。