修改文件中的换行符

修改文件中的换行符

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值分行
  • 写入文件时,如果 newlineNone,则系统默认行分隔符。如果 newline'''\n',则不进行翻译。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章