修改文件中的換行符

修改文件中的換行符

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',則不進行翻譯。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章