修改文件中的換行符
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'
,則不進行翻譯。