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

发布于 2021-01-29 17:18:42

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

关注者
0
被浏览
219
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    就地转换线尾(使用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)
    

    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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看