我是Python的新手。
我使用python脚本将一系列文件导入sqlite3数据库。某些原始文件具有虚假的^M
个字符,可将记录拆分为多行。
以下sed命令正确删除^M
并加入两行,创建有效记录。
sed -i '/^M^M$/ {s/^M//g;N;s/\n//};' <file>
上面的^M
是使用CTRL+V CTRL+M
序列创建的。
sed调用的Python行是:
cmd = "sed -i '/\^M\^M$/ {s/\^M//g; N; s/\n////g; };' %s" % (file)
os.system(cmd)
我在Python中尝试了各种转义序列(包括三元组'')并获得解析错误,包括unterminated address regex
,unterminated 's' command
和unknown option to 's'
,并且没有转义{ {1}}我得到了^M
我怎么能
a)对sed调用进行编码,以便在使用SyntaxError: EOL while scanning string literal
或
b)直接在python中执行等效替换(可能更好,但我希望能够在一次传递中执行多种类型的更正,而不是每种更正类型一次传递)。
谢谢。
答案 0 :(得分:4)
^M
字符为Carriage Return (CR)
。它是python中的'\r'
字符。
所以,我想,这应该可以正常工作:
cmd = "sed -i '/\r\r$/ {s/\r//g; N; s/\\n////g; };' %s" % (file)
os.system(cmd)
答案 1 :(得分:1)
这会更容易,特别是因为你说你有多个替换要执行,完全用Python完成。回车符是"\r"
。
该任务的未经测试代码如下:
replacements = (("\r", ""),
("one", "two"),
("three", "four"))
with open(filename, "r") as fin, open(filename+".new", "w") as fout:
data = fin.read()
for t1, t2 in replacements:
data = data.replace(t1, t2)
fout.write(data)
然后,它仍然是读者重命名输出文件以覆盖输入文件的练习。顺便说一下,请注意,此代码是明确设计用于处理文本文件的。在Python 3中会产生影响。