如何在Windows机器上以Python将CRLF转换为LF
所以我得到了那些模板,它们都以LF结尾,我可以用format填充一些术语,并且仍然可以通过用“ wb”打开来获取LF文件
这些模板在Windows计算机上的部署脚本中使用,以在UNIX服务器上进行部署。
问题是,很多人都将这些模板弄得一团糟,我100%确信其中有些人会在其中放入一些CRLF。
我如何使用python将所有crlf转换为lf?
谢谢。
编辑
好吧,我的糟糕,我的代码中有一个错误,即使文件以前使用crlf,在“ wb”中打开也总是将lf放在行的末尾。
如果您想知道,这是我正在使用的代码:
#!/usr/bin/env python# --*-- encoding: iso-8859-1 --*--
import string
def formatFile(templatePath, filledFilePath, params, target):
openingMode = 'w'
if target == 'linux':
openingMode += 'b'
with open(templatePath, 'r') as infile, open(filledFilePath, openingMode) as outfile:
for line in infile:
template = string.Template(line.decode('UTF-8'))
outfile.write(template.substitute(**params).encode('UTF-8'))
所以没问题,一切都很好:x
回答:
就地转换线尾(使用Python 3)
Windows到Linux / Unix
这是一个简短的脚本,用于直接将 (\r\n
也称为CRLF
)直接转换为
(\n
也称为LF
)(无需创建额外的输出文件):
# replacement stringsWINDOWS_LINE_ENDING = b'\r\n'
UNIX_LINE_ENDING = b'\n'
# relative or absolute file path, e.g.:
file_path = r"c:\Users\Username\Desktop\file.txt"
with open(file_path, 'rb') as open_file:
content = open_file.read()
content = content.replace(WINDOWS_LINE_ENDING, UNIX_LINE_ENDING)
with open(file_path, 'wb') as open_file:
open_file.write(content)
Linux / Unix到Windows
只需str.replace()
像这样在调用中交换行尾的常量即可:content.replace(UNIX_LINE_ENDING,
WINDOWS_LINE_ENDING)。
代码说明
- 我们需要确保同时以二进制模式(
mode='rb'
和mode='wb'
)打开文件两次,以使转换正常进行。
当以文本模式(mode='r'
或mode='w'
不使用b
)打开文件时,平台的本机行尾(\r\n
在Windows和\r
旧的Mac
OS版本上)将自动转换为Python的Unix风格的行尾:\n
。因此,对的调用content.replace()
找不到\r\n
要替换的任何行尾。
在二进制模式下,不会进行此类转换。因此,to的呼叫str.replace()
可以完成其工作。
在Python 3中,如果没有另外声明,则字符串存储为Unicode(
UTF-8
)。但是我们以二进制模式打开文件-因此我们需要b
在替换字符串之前添加内容,以告诉Python也将这些字符串作为二进制进行处理。在Windows上,路径分隔符是反斜线
\
,我们需要使用来在普通的Python字符串中进行转义\\
。通过r
在字符串前面添加,我们创建了一个所谓的“原始字符串”,它不需要任何转义。因此,您可以将Windows资源管理器中的路径直接复制/粘贴到脚本中。
( 提示: 在Windows资源管理器中,按CTRL
+L
可以从地址栏中自动选择路径。)
- 我们打开文件两次,以避免需要重新定位文件指针。我们也可以用一次打开该文件,
mode='rb+'
但随后我们需要在读取其内容(open_file.seek(0)
)之后将指针移回开始,并在写入新文件(open_file.truncate(0)
)之前截断其原始内容。
只需在写入模式下再次打开文件即可自动完成。
干杯和快乐的编程,
winklerrr
以上是 如何在Windows机器上以Python将CRLF转换为LF 的全部内容, 来源链接: utcz.com/qa/430054.html