在Python 3.6中用LF替换CRLF

时间:2017-11-08 11:23:54

标签: python-3.x

我尝试过在网上搜索,以及我在网上看过的很多不同的内容,但似乎并没有得到理想的结果。

我使用的是Windows 7和Python 3.6。

我使用cx_oracle连接到Oracle数据库并使用查询结果创建文本文件。创建的文件(我将调用my_file.txt以使其变得简单)中有3688行,所有CRLF都需要转换为unix LF。

如果我运行python crlf.py my_file.txt,它将全部正确转换&没有问题,但这意味着我需要手动运行另一个命令,我不想这样做。

所以我尝试将下面的代码添加到我的文件中。

filename = "NameOfFileToBeConverted"
fileContents = open(filename,"r").read()
f = open(filename,"w", newline="\n")
f.write(fileContents)
f.close()

这确实将CRLF的大部分转换为LF,但@ line 3501在一行上有一个NUL字符3500次,接着是数据库中的一行数据&它以CRLF结束,此处的每一行仍然具有CRLF。

因此,如果不能正常工作,我将其删除然后尝试

import subprocess
subprocess.Popen("crlf.py "+ filename, shell=True)

我也尝试过使用

import os
os.system("crlf.py "+ filename)

" + filename"在上面两个例子中,只提供了在数据提取过程中创建的文件名。

我不知道还有什么可以尝试的。

1 个答案:

答案 0 :(得分:0)

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


代码说明

  • 重要提示:二进制模式我们需要确保同时以二进制模式(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的调用找不到要替换的任何行尾。

    在二进制模式下,不会进行此类转换。

  • 二进制字符串在Python 3中,如果未另行声明,则字符串将存储为Unicode(content.replace())。但是我们以二进制模式打开文件-因此我们需要在替换字符串之前添加UTF-8,以告诉Python也将这些字符串作为二进制进行处理。

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

  • 替代我们两次打开文件,以避免需要重新放置文件指针。我们也可以使用r打开一次文件,但是在读取内容(mode='rb+'之后,我们需要将指针移回开始位置,并在写入新内容之前截断其原始内容({ {1}}。

    仅以写入模式再次打开文件会对我们自动完成。

欢呼和快乐的编程,
温克勒尔