Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python字符串文本、正则表达式和sed_Python_Regex_Sed - Fatal编程技术网

Python字符串文本、正则表达式和sed

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

我是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)
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很难针对此注释进行转义!:谢谢你的评论!