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

问题描述 投票:7回答:4

所以,我的模板,他们在LF结束一切,我可以填补一些方面与内部格式,并仍然由开得LF文件“WB”

这些模板在部署脚本中使用Windows计算机上的UNIX服务器上部署。

问题是,很多人都去招惹那些模板,我100%肯定,有些人会放一些CRLF内。

我怎么可能,使用python将所有的CRLF到LF?

谢谢。

EDIT

好了,是我不好,我有一个错误在我的代码,在线条的末端,即使文件被使用之前在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

python python-2.7
4个回答
12
投票

Convert Line Endings in-place (with Python 3)

Windows to 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 to Windows

只是交换常数在str.replace()呼叫,像这样的行结尾:content.replace(UNIX_LINE_ENDING, WINDOWS_LINE_ENDING)


Code Explanation

  • 重要提示:二进制模式中,我们需要确保我们在二进制模式(mode='rb'mode='wb')的转换工作打开文件两次。 当在文本模式(mode='r'mode='w'b)打开文件,平台的本地行结尾(在Windows \r\n\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


8
投票

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。)


1
投票

你为什么不试试下面:: str.replace( '\ r \ n', '\ n');

CRLF => \ r \ n LF => \ n

这是打字机的历史=)


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)
© www.soinside.com 2019 - 2024. All rights reserved.