Python字符串文本、正则表达式和sed
我是Python新手 我正在使用python脚本将一系列文件导入sqlite3数据库。一些原始文件具有虚假的Python字符串文本、正则表达式和sed,python,regex,sed,Python,Regex,Sed,我是Python新手 我正在使用python脚本将一系列文件导入sqlite3数据库。一些原始文件具有虚假的^M字符,将记录拆分为多行 下面的sed命令正确地删除了^M,并连接了两行,从而创建了一个有效的记录 sed-i'/^M^M$/{s/^M//g;N;s/\N/};' 上面的^M是使用CTRL+V CTRL+M序列创建的 sed调用的Python行包括: cmd = "sed -i '/\^M\^M$/ {s/\^M//g; N; s/\n////g; };' %s" % (file) o
^M
字符,将记录拆分为多行
下面的sed命令正确地删除了^M
,并连接了两行,从而创建了一个有效的记录
sed-i'/^M^M$/{s/^M//g;N;s/\N/};'代码>
上面的^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中尝试了各种转义序列(包括三元组“”),并得到了解析错误,包括未终止的地址正则表达式
,未终止的's'命令
和's'的未知选项
,在不转义^M
的情况下,我在扫描字符串文字时遇到了一个硬停止解析错误SyntaxError:EOL
我怎么能这样呢
a) 对sed调用进行编码,以便在使用os.system(cmd)
或
b) 直接在python中执行等效的替换(可能更可取,但我希望能够在一个过程中执行多种类型的更正,而不是每个更正类型执行一个过程)
谢谢。^M
字符是回车(CR)
。它是python中的'\r'
字符
所以,我想,这应该很好:
cmd = "sed -i '/\r\r$/ {s/\r//g; N; s/\\n////g; };' %s" % (file)
os.system(cmd)
完全用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)
然后,读取器将重命名输出文件以覆盖输入文件作为练习。顺便说一句,请注意,此代码是显式设计用于处理文本文件的。在Python3中,这会有所不同。通常强烈建议使用子流程
模块而不是os.system
来调用外部二进制文件。还有一些很好的例子,看起来您正在为每个文件派生一个新的sed
@holdenweb的解决方案可能比这样做更好,但如果您有“大量”文件,那么优化sed
调用并只分叉一个可能是最好的解决方案。如果你担心速度的话,这两种方法都值得一试吗?@HumphreyTriscuit是的。我从一个文件开始,但计划在它开始工作后将其合并为一个调用。婴儿步现在,我正在尝试holdenweb建议的变体,看看是否可以在没有spawn的情况下让它工作。它只有几百万条记录和大约30个文件,但我希望它能合理高效。太棒了。我一定很想知道哪一个对你来说更快!:)这部分起作用。它删除了^M
,但没有将该行与下一行连接起来[只有在有替换时才连接一行],以便在行之间分割时创建有效记录,但保留其他行不变(上述sed命令的N;s/\N////g;
部分)。您可以使用for line in fin:for t1,替换中的t2:line=line。替换(t1,t2)line。写入(数据)
True,即。与许多程序一样,有很多方法可以平衡内存和时间,我的解决方案针对时间进行了优化,其缺点是它不能用于处理大文件cmd=“sed-i'/\r\r$/{s/\r//g;N;s/\\N//g;};'%s'%(文件)
工作。它需要对
\n`中的`进行转义。我将继续尝试让本机python解决方案发挥作用,但这让我开始工作。*对于\n
中的\
的escape很难针对此注释进行转义!:谢谢你的评论!