Python2.7调用Linux split命令拆分文件时数据截断问题求助
解决Python 2.7调用split命令时文件截断的问题
你的问题出在未正确等待split进程执行完毕,且管道通信处理不当导致进程提前终止。直接在shell执行时,shell会全程等待split完成文件拆分;但Python代码里仅启动进程就立刻读取输出,此时split可能还在写入文件就被中断,最终导致文件行数不足、内容截断。
修复方案
推荐使用subprocess.Popen的communicate()方法,它会自动等待进程结束,同时安全处理stdout/stderr的读取,避免管道阻塞或进程中断:
import subprocess cmd = 'split -a 4 --verbose --lines 1000 --additional-suffix=.csv master.csv split_file_' p = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 等待进程完成并获取输出 stdout, stderr = p.communicate() p.stdin.close() print "Stdout:", stdout print "Stderr:", stderr
如果想避免shell=True带来的安全风险(比如命令注入),可以将命令拆分为参数列表:
import subprocess cmd_args = [ 'split', '-a', '4', '--verbose', '--lines', '1000', '--additional-suffix=.csv', 'master.csv', 'split_file_' ] p = subprocess.Popen(cmd_args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = p.communicate() p.stdin.close() print "Stdout:", stdout print "Stderr:", stderr
为什么原来的代码会出问题
Popen启动进程后会立即返回,此时split在后台运行。如果直接读取stdout/stderr而不等待进程结束,当管道缓冲区被填满时,split会陷入阻塞;若Python进程此时继续执行后续逻辑,可能会提前终止split进程,导致文件未完成写入,最终出现行数不足、内容截断的异常。而communicate()会全程等待进程执行完毕,确保split完成所有文件写入操作。
内容的提问来源于stack exchange,提问作者chandramohan
相关产品推荐
相关产品推荐

