【发布时间】:2016-07-05 10:39:31
【问题描述】:
我是 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',并且没有转义 ^M 我很难-停止SyntaxError: EOL while scanning string literal的解析错误
我该怎么做
a) 对 sed 调用进行编码,以便在使用 os.system(cmd) 调用时正确执行
或
b) 直接在 python 中执行等效替换(可能更可取,但我希望能够一次执行多种类型的校正,而不是每种校正类型一次)。
谢谢。
【问题讨论】:
-
通常强烈建议使用
subprocess模块而不是os.system来调用外部二进制文件。 stackoverflow.com/questions/6706953/…有一些很好的例子 -
另外,您似乎正在为每个文件创建一个新的
sed? @holdenweb 的解决方案可能会比这样做更好,但是如果您有“大量”文件,那么优化您的sed调用并且只分叉一个可能是最好的解决方案。如果您担心速度,可能都值得测试? -
@HumphreyTriscuit 是的。我从一个文件开始,但计划在我开始工作后将它组合成一个调用。婴儿步。 ;) 现在我正在尝试改变holdenweb 的建议,看看我是否可以在没有产卵的情况下让它工作。它只有几百万条记录和大约 30 个文件,但我希望它相当高效。
-
太棒了。我一定很想知道哪一个对你来说更快! :)