如何在Python中在Windows计算机上将CRLF转换为LF

如何在Python中在Windows计算机上将CRLF转换为LF,python,python-2.7,Python,Python 2.7,所以我得到了这些模板,它们都以LF结尾,我可以用格式填充一些术语,并且仍然可以通过使用“wb”打开来获得LF文件 这些模板在windows计算机上的部署脚本中用于在unix服务器上部署 问题是,很多人会弄乱这些模板,我100%肯定他们中的一些人会在里面放一些CRLF 如何使用Python将所有CRLF转换为LF 谢谢 编辑:我的错,我的代码中有一个bug,在“wb”中打开时总是将LF放在行的末尾,即使文件以前使用过CRLF 如果您想知道,下面是我正在使用的代码: #!/usr/bin/env p

所以我得到了这些模板,它们都以LF结尾,我可以用格式填充一些术语,并且仍然可以通过使用
“wb”
打开来获得LF文件

这些模板在windows计算机上的部署脚本中用于在unix服务器上部署

问题是,很多人会弄乱这些模板,我100%肯定他们中的一些人会在里面放一些CRLF

如何使用Python将所有CRLF转换为LF

谢谢

编辑:我的错,我的代码中有一个bug,在
“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

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

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

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

(由于换行符参数,在Python 3中实际上不推荐使用U;等效形式为
newline=None

可以修复现有模板,使其以以下代码结尾:

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)
你为什么不试试下面的:: str.replace('\r\n','\n')

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

这是打字机的历史=)

将行尾转换到位(使用Python 3) Windows到Linux/Unix 下面是一个简短的脚本,用于将Windows行结束符
\r\n
也称为
CRLF
)直接转换为Linux/Unix行结束符
\n
也称为
LF
)(无需创建额外的输出文件):

Linux/Unix到Windows 只需交换
str.replace()
调用中的行尾常量,如下所示:
content.replace(UNIX\u line\u ENDING,WINDOWS\u line\u 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()
可以完成它的工作

二进制字符串 在Python3中,如果没有另外声明,字符串将存储为Unicode(
UTF-8
)。但是我们以二进制模式打开文件-因此我们需要在替换字符串前面添加
b
,以告诉Python也将这些字符串作为二进制处理

原始字串 在Windows上,路径分隔符是一个反斜杠
\
,我们需要用
\\
在普通Python字符串中转义它。通过在字符串前面添加
r
,我们创建了一个所谓的“原始字符串”,它不需要任何转义。因此,您可以直接将路径从Windows资源管理器复制/粘贴到脚本中

(提示:在Windows资源管理器中,按CTRL+L从地址栏自动选择路径。)

替代解决方案 我们打开文件两次,以避免重新定位文件指针。我们也可以使用
mode='rb+'
打开文件一次,但是我们需要在读取其内容后将指针移回start(
open\u file.seek(0)
),并在写入新内容之前截断其原始内容(
open\u file.truncate(0)

只需在写入模式下再次打开文件,我们就可以自动完成这项操作

干杯,快乐节目,

winklerrr

我无法从文件中获取
内容,因此无法以二进制模式读取。基本上我有一个“多行字符串”。因此,我得到
TypeError:replace()参数1必须是str,而不是bytes
。有解决方案吗?@AstroFloyd您首先需要将字符串转换为字节:
byte\u str=your\u str.encode(“UTF-8”)
。然后替换
字节的行尾。要将其转换回字符串,请使用:
your\u new\u str=byte\u str.decode(“UTF-8”)
。谢谢,我在windows中用“w”打开文件,但它已转换为crlf。所以这对我来说不是真的:
在文本模式下打开文件(mode='r'或mode='w'不带b),平台的本机行结尾(\r\n在Windows上和\r在旧Mac OS版本上)会自动转换为Python的Unix风格行结尾:\n根据开放函数的官方说法:“允许使用另一个模式字符‘U’,该字符不再具有任何效果,被视为不推荐使用。它以前在文本模式下启用了通用换行符,这成为Python 3.0中的默认行为。有关更多详细信息,请参阅换行符参数的文档。注意Python不依赖于底层操作系统的文本文件概念;所有的处理都是由Python自己完成的,因此是独立于平台的。”它不会像这样工作,因为Python会更改为当前系统默认的行结尾(对于Windows是CRLF)。因此您需要使用二进制模式(不阻止Python进行任何更改)或使用
换行符
参数,如投票结果所示。
# 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)