使用子进程检查文件的记录数

时间:2017-06-22 19:19:30

标签: python subprocess

如果文件只有一行,则发送错误消息。我使用的是Python 2.6.9版本。以下是我的代码。我得到了行数,但条件是否有效。

import os
import subprocess
count=subprocess.Popen('wc -l <20170622.txt', shell=True, stdout=subprocess.PIPE)

if count.communicate() == 1: 
    sys.exit("File has no data - 20170622.txt")

我尝试了不同的方法来使if条件有效,但没有运气。 在这里,我想检查文件是否有多行。如果它没有超过我必须发送错误消息的行。

2 个答案:

答案 0 :(得分:1)

from subprocess import Popen, PIPE

count = Popen("wc -l <20170622.txt", shell=True, stdout=PIPE)

if count.wait() == 0:                        # 0 means success here
    rows = int(count.communicate()[0])       # (stdout, stderr)[0]
    if rows == 1:                            # only one row
        # do something...       
else: 
    print("failed")                          # assume anything else to be failure

Popen成功返回0,因此首先我们必须检查命令是否成功运行:count.wait() - 等待进程完成并返回其退出代码。

答案 1 :(得分:0)

如上所述,process.communicate()返回一个元组。您感兴趣的部分是第一部分,因为它包含标准输出。此外,通常最好不要在shell=True中使用Popen。可以使用打开的文件描述符作为stdin来重写它。这给你一个像(使用Python 3)的程序:

import sys
from subprocess import Popen, PIPE

input_file = '20170622.txt'

myinput = open(input_file)
with open(input_file, 'r') as myinput, Popen(['wc', '-l'], stdin = myinput, stdout=PIPE) as count:

    mystdout, mystderr = count.communicate()
    lines = int(mystdout.strip())
    print(lines)

    if lines <= 1: 
        sys.exit("File has no data - {}".format(input_file))