所以我得到了那些模板,它们都以LF结尾,我可以在里面用格式填写一些术语,然后通过打开“wb”来获取LF文件
这些模板用于Windows计算机上的部署脚本中,以部署在unix服务器上。
问题是,很多人都会弄乱这些模板,而且我百分之百肯定他们中的一些人会把一些CRLF放进去。
我怎么能用python将所有crlf转换成lf?
感谢。
好吧,我的不好,我的代码中有一个错误,打开“wb”总是把lf放在行的末尾,即使文件之前使用的是crlf。
如果您想知道,以下是我正在使用的代码:
#!/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
答案 0 :(得分:10)
这是一个简短的脚本,用于直接将 Windows行结尾(\r\n
也称为CRLF
)转换为 Linux / Unix行结尾({ {1}}也就地调用了\n
)(没有创建额外的输出文件):
LF
只需在# replacement strings
WINDOWS_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)
调用中交换行结尾的常量,如下所示:str.replace()
。
重要:二进制模式我们需要确保以二进制模式(content.replace(UNIX_LINE_ENDING, WINDOWS_LINE_ENDING)
和mode='rb'
)打开文件,以便转换工作
在文本模式下打开文件(mode='wb'
或mode='r'
没有mode='w'
)时,平台的本机行结尾(Windows上为b
,旧时为\r\n
Mac OS版本)会自动转换为Python的Unix风格的行结尾:\r
。因此,对\n
的调用无法找到要替换的任何content.replace()
行结尾。
在二进制模式下,不进行此类转换。因此,对\r\n
的调用可以完成其工作。
二进制字符串在Python 3中,如果没有另外声明,字符串将存储为Unicode(str.replace()
)。但是我们以二进制模式打开文件 - 因此我们需要在替换字符串前添加UTF-8
以告诉Python将这些字符串作为二进制文件处理。
原始字符串在Windows上,路径分隔符是反斜杠b
,我们需要使用\
在普通的Python字符串中进行转义。通过在字符串前面添加\\
,我们创建了一个所谓的“原始字符串”,它不需要任何转义。因此,您可以直接将路径从Windows资源管理器复制/粘贴到脚本中。
(提示:在Windows资源管理器中按 CTRL + L 以自动从地址栏中选择路径。)
< / LI> 替代我们打开文件两次,以避免重新定位文件指针。我们也可以使用r
打开文件一次但是我们需要在读取其内容(mode='rb+'
)之后将指针移回开始并在写入新内容之前截断其原始内容({ {1}})。
只需在写入模式下再次打开文件,我们就会自动执行此操作。
欢呼和愉快的节目,
winklerrr
答案 1 :(得分:7)
Python的open函数支持universal newlines的'rU'
模式,在这种情况下,它不介意每行有哪种换行符。在Python 3中,您还可以使用newline argument for open请求特定形式的换行符。
因此,在Python中从一种形式转换为另一种形式非常简单:
with open('filename.in', 'rU') as infile, \
open('filename.out', 'w', newline='\n') as outfile:
outfile.writelines(infile.readlines())
(由于newline参数,在Python 3中实际上不推荐使用U;等效形式为newline=None
。)
答案 2 :(得分:1)
为什么不在下面尝试:: str.replace(&#39; \ r \ n&#39;&#39; \ n&#39);
CRLF =&gt; \ r \ n LF =&gt; \ n
它的打字机历史=)
答案 3 :(得分:0)
可以使用以下代码修复现有模板的混乱:
with open('file.tpl') as template:
lines = [line.replace('\r\n', '\n') for line in template]
with open('file.tpl', 'w') as template:
template.writelines(lines)