我尝试过在网上搜索,以及我在网上看过的很多不同的内容,但似乎并没有得到理想的结果。
我使用的是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"在上面两个例子中,只提供了在数据提取过程中创建的文件名。
我不知道还有什么可以尝试的。
答案 0 :(得分:0)
这是一个简短的脚本,用于将 Windows行尾(\r\n
也称为CRLF
)直接转换为 Linux / Unix行尾({ {1}}(也称为\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)
。
重要提示:二进制模式我们需要确保同时以二进制模式(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}}。
仅以写入模式再次打开文件会对我们自动完成。
欢呼和快乐的编程,
温克勒尔