如何使用subprocess和'cat'逐行读入数据?
How to use subprocess and 'cat' to read in data line by line?
我无法理解如何使用 subprocess
解决我的问题。
假设我的子目录中有一个制表符分隔的文本文件 tabdelimited1.txt
,我想将其读入 pandas 数据框。
当然,您可以按如下方式简单地导入数据:
import pandas as pd
df = pd.read_csv("tabdelimited1.txt", header=None, sep="\s+")
但是,假设我们想使用 subprocess
。在命令行中,$cat tabdelimited1.txt
将输出所有行。
现在,我想使用子进程读取 cat tabdelimited1.txt
的输出。如何做到这一点?
我们可以使用
import subprocess
task = subprocess.Popen("cat file.txt", shell=True, stdout=subprocess.PIPE)
data = task.stdout.read()
但是 (1) 我收到 shell=True
的错误,并且 (2) 我想逐行读取数据。
如何使用 subprocess
逐行阅读 tabdelimited1.txt
?该脚本应如下所示:
import subprocess
import pandas as pd
df = pd.DataFrame()
task = subprocess.Popen("cat file.txt", shell=True, stdout=subprocess.PIPE)
# while lines exist:
# line = subprocess std
df=pd.concat([df, line])
已编辑
您可以通过将命令分成列表来完全跳过 shell。然后它只是迭代过程标准输出的问题:
import subprocess
import pandas as pd
df = pd.DataFrame()
task = subprocess.Popen(["cat", "file.txt"], stdout=subprocess.PIPE)
for line in task.stdout:
df=pd.concat([df, line])
task.wait()
import sys
for line in sys.stdin:
print(line.split())
可以与 shell 命令一起使用,例如:
0025:~/mypy$ cat x.txt | python3 stack39864304.py
['1', '3', 'test1;']
['2', '2', 'test2;']
['3', '2', 'test3;']
否则在交互式会话中我可以这样做:
In [269]: task = subprocess.Popen("cat x.txt", shell=True, stdout=subprocess.PIPE)
In [270]: for line in task1.stdout:print(line.split())
[b'1', b'3', b'test1;']
[b'2', b'2', b'test2;']
[b'3', b'2', b'test3;']
(py3 字节串)
python3 stack39864304.py < x.txt
是将此文件发送到脚本的另一种方式。
cat afile | ...
可能太简单了,大家反对为什么不直接看。但是 cat
可以替换为 head
、tail
甚至 ls -l | python3 stack39864304.py
以获取具有此 split
.
的目录列表
我使用 ipython
进行大部分交互式 python 编码;它的许多 %magic
使用子流程;我在这个会话中一直使用 cat x.txt
、ls
。
我无法理解如何使用 subprocess
解决我的问题。
假设我的子目录中有一个制表符分隔的文本文件 tabdelimited1.txt
,我想将其读入 pandas 数据框。
当然,您可以按如下方式简单地导入数据:
import pandas as pd
df = pd.read_csv("tabdelimited1.txt", header=None, sep="\s+")
但是,假设我们想使用 subprocess
。在命令行中,$cat tabdelimited1.txt
将输出所有行。
现在,我想使用子进程读取 cat tabdelimited1.txt
的输出。如何做到这一点?
我们可以使用
import subprocess
task = subprocess.Popen("cat file.txt", shell=True, stdout=subprocess.PIPE)
data = task.stdout.read()
但是 (1) 我收到 shell=True
的错误,并且 (2) 我想逐行读取数据。
如何使用 subprocess
逐行阅读 tabdelimited1.txt
?该脚本应如下所示:
import subprocess
import pandas as pd
df = pd.DataFrame()
task = subprocess.Popen("cat file.txt", shell=True, stdout=subprocess.PIPE)
# while lines exist:
# line = subprocess std
df=pd.concat([df, line])
已编辑
您可以通过将命令分成列表来完全跳过 shell。然后它只是迭代过程标准输出的问题:
import subprocess
import pandas as pd
df = pd.DataFrame()
task = subprocess.Popen(["cat", "file.txt"], stdout=subprocess.PIPE)
for line in task.stdout:
df=pd.concat([df, line])
task.wait()
import sys
for line in sys.stdin:
print(line.split())
可以与 shell 命令一起使用,例如:
0025:~/mypy$ cat x.txt | python3 stack39864304.py
['1', '3', 'test1;']
['2', '2', 'test2;']
['3', '2', 'test3;']
否则在交互式会话中我可以这样做:
In [269]: task = subprocess.Popen("cat x.txt", shell=True, stdout=subprocess.PIPE)
In [270]: for line in task1.stdout:print(line.split())
[b'1', b'3', b'test1;']
[b'2', b'2', b'test2;']
[b'3', b'2', b'test3;']
(py3 字节串)
python3 stack39864304.py < x.txt
是将此文件发送到脚本的另一种方式。
cat afile | ...
可能太简单了,大家反对为什么不直接看。但是 cat
可以替换为 head
、tail
甚至 ls -l | python3 stack39864304.py
以获取具有此 split
.
我使用 ipython
进行大部分交互式 python 编码;它的许多 %magic
使用子流程;我在这个会话中一直使用 cat x.txt
、ls
。