如何在Python上的Windows机器上将CRLF转换为LF

时间:2016-04-05 09:19:09

标签: python python-2.7

所以我得到了那些模板,它们都以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

4 个答案:

答案 0 :(得分:10)

就地转换行结尾(使用Python 3)

Windows到Linux / Unix

这是一个简短的脚本,用于直接将 Windows行结尾\r\n也称为CRLF)转换为 Linux / Unix行结尾({ {1}}也就地调用了\n)(没有创建额外的输出文件):

LF

Linux / Unix到Windows

只需在# 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)