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

Eil*_*osa 7 python python-2.7

所以我得到了那些模板,它们都以LF结尾,我可以用格式填写一些术语,并通过打开"wb"仍然获得LF文件

这些模板在Windows计算机上的部署脚本中使用,以部署在unix服务器上.

问题是,很多人都会弄乱这些模板,而且我100%肯定他们中的一些人会把一些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'))
Run Code Online (Sandbox Code Playgroud)

所以没问题,一切正常:x

win*_*rrr 14

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

Windows到Linux/Unix

这是一个简短的脚本,用于将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)
Run Code Online (Sandbox Code Playgroud)

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行结尾来替换.

    在二进制模式下,不进行这样的转换.因此呼叫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


Yan*_*ier 8

Python的open函数支持通用换行'rU'模式,在这种情况下,它不介意每行有哪种换行符.在Python 3中,您还可以使用newline参数请求特定形式的换行符.

因此,在Python中从一种形式转换为另一种形式相当简单:

with open('filename.in', 'rU') as infile,                 \
   open('filename.out', 'w', newline='\n') as outfile:
       outfile.writelines(infile.readlines())
Run Code Online (Sandbox Code Playgroud)

(由于newline参数,在Python 3中实际上不推荐使用U;等效形式是newline=None.)