所以,我的模板,他们在LF结束一切,我可以填补一些方面与内部格式,并仍然由开得LF文件“WB”
这些模板在部署脚本中使用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
这里是直接转换Windows行尾(\r\n
也称为CRLF
)到Linux / Unix行结尾(\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'
不b
)打开文件,平台的本地行结尾(在Windows \r\n
和\r
旧Mac OS版本)会自动转换为Python的Unix风格的行结束:\n
。所以调用content.replace()
找不到任何\r\n
行结尾来代替。
在二进制模式下,没有这样的转换完成。因此,呼吁str.replace()
可以做其工作。UTF-8
)。但是,我们在二进制模式下打开我们的文件 - 因此,我们需要在我们的替换字符串前加b
告诉Python处理这些字符串作为二进制了。\
,我们需要在一个普通的Python字符串\\
逃跑。通过在字符串前添加r
我们创建了一个所谓的“原始字符串”,它不需要任何转义。所以,你可以直接复制/从Windows资源管理器的路径粘贴到你的脚本。
(提示:内部Windows资源管理器按CTRL + L自动选择从地址栏的路径。)mode='rb+'
一旦打开该文件,但随后我们会需要将指针移至反读取其内容(open_file.seek(0)
)后,开始续写新的(open_file.truncate(0)
)之前截断其原始内容。
只需在写模式再次打开该文件,这是否自动为我们。欢呼声和快乐的编程, winklerrr
Python的open功能支持'rU'
的universal newlines模式,在这种情况下,不介意每一行都有哪些类型的换行符。在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())
(由于新行参数,U被弃用实际上在Python 3;等效形式是newline=None
。)
你为什么不试试下面:: str.replace( '\ r \ n', '\ n');
CRLF => \ r \ n LF => \ n
这是打字机的历史=)
它可以用混乱的这段代码结尾修复现有的模板:
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)