1

我有一行 Python 代码产生了我想要的东西。代码是:

os.system('cat {0}|egrep {1} > file.txt' .format(full,epoch))

并生成了一个包含以下内容的文件:

3                321.000 53420.7046629965511    0.299                 0.00000
3                325.000 53420.7046629860714    0.270                 0.00000
3                329.000 53420.7046629846442    0.334                 0.00000
3                333.000 53420.7046629918374    0.280                 0.00000

然后我只想调整代码,以便在顶部说“TEXT 1”,所以我尝试了我脑海中出现的第一件事,并将代码更改为:

h = open('file.txt','w')
h.write('MODE 2\n')
os.system('cat {0}|egrep {1} > file.txt' .format(full,epoch))

当我这样做时,我得到输出:

TEXT 1
   317.000 54519.6975201839344    0.627                 0.00000
3                321.000 54519.6975202038578    0.655                 0.00000
3                325.000 54519.6975201934045    0.608                 0.00000
3                329.000 54519.6975201919911    0.612                 0.00000

即“TEXT 1”之后的第一行不正确,并且缺少第一个“3”。谁能告诉我我做错了什么,并且可能是完成这个简单任务的更好方法。

谢谢你。

4

2 回答 2

2

您可以按自己的方式调用 grep,也可以使用 subprocess.call(),这是我的首选方法。

方法一:使用 os.system()

os.system('echo TEXT 1 >file.txt; egrep {1} {0} >> file.txt'.format(full, epoch))

此方法将在调用之前添加TEXT 1egrep。请注意,您不需要cat.

方法二:使用 subprocess.call()

with open('out.txt', 'wb') as output_file:
    output_file.write('TEXT 1\n')
    output_file.flush()
    subprocess.call(['egrep', epoch, full], stdout=output_file)

这是我首选的方法有几个原因:您可以更好地控制输出文件,例如在打开失败时处理异常的能力。

于 2013-04-25T23:21:07.607 回答
1

你用 python 打开一个文件句柄,写入它,但是 Python 把它留给操作系统来做刷新等 - 按照设计,如果想要在其他东西被写入之前将一些东西写入文件,你需要flush它手动(实际上,您需要flush and fsync)。

另一个注意事项:> file.txt创建一个新文件,而您可能想要追加- 将被写为>> file.txt. 简而言之:您的代码可能比您想象的更不确定。

另一种方法是使用subprocess模块,因为您已经处于 shell 级别:

from subprocess import call

sts = call("echo 'TEXT 1' > file.txt", shell=True)
sts = call("cat {0}|egrep {1} >> file.txt".format(full,epoch), shell=True)
于 2013-04-25T23:01:32.897 回答